django模型方法的行为类似于字段
我想要实现的结构是, 我们有一个Foo模型和Foox模型django模型方法的行为类似于字段,django,django-models,Django,Django Models,我想要实现的结构是, 我们有一个Foo模型和Foox模型 class Foo(models.Model): ... class Foox(models.Model): foo = models.Foreignkey(Foo) stext = models.CharField(max_length=80, verbose_name='description') langu = models.ForeignKey(Langutable, verbose_name='
class Foo(models.Model):
...
class Foox(models.Model):
foo = models.Foreignkey(Foo)
stext = models.CharField(max_length=80, verbose_name='description')
langu = models.ForeignKey(Langutable, verbose_name='Language')
我将使用Foox模型创建Foo模型stext字段,
当我激活“en”语言,并在模板或代码中使用Foo的stext字段时
假设我在模板中使用了{{Foo.stext}}。该值将使用
Foox.objects.get(foo=foo,langu='en').values('stext')[0]['stext']
如果我在代码中编写foo.stext。我的模型应该知道stext是一个属性,来自Foox模型
class Foo(models.Model):
...
class Foox(models.Model):
foo = models.Foreignkey(Foo)
stext = models.CharField(max_length=80, verbose_name='description')
langu = models.ForeignKey(Langutable, verbose_name='Language')
到目前为止,我使用下面的unicode代码实现了这一点
def __unicode__(self):
stext = ''
try:
from panbas.models import Langutable
langu = Langutable.objects.get(langu='en')
xtablelookup = '{}{}'.format(self.__class__.__name__.lower(), 'x')
if xtablelookup in model_util.get_one_to_many_field_names(self.__class__):#I check if there is a Foox model, model_util function does that, returns ['foox']
stext = self.foox_set.filter(langu=langu).values('stext')[0]['stext']
except:
pass
return '{} {}'.format(self.short_cut, stext)#finally stext came from foox table.
我的方法正确吗?还有更好的方法吗。我实际上需要一种方法来定义一个字段,用于查询其他模型。并且不存在于数据库中。只是个占位符什么的
我们有模型管理器和类方法,我就是搞不懂
我知道其他多语言方法,请不要建议我使用它们。您可以使用
@property
装饰器来检索和更新转换后的值
class Foox(models.Model):
foo = models.Foreignkey(Foo)
stext = models.CharField(max_length=80, verbose_name='description')
langu = models.ForeignKey(Langutable, verbose_name='Language')
class Foo(models.Model):
...
@property
def stext(self):
return Foox.objects.get(foo=self, langu=settings.LANGUAGE_CODE).stext
@stext.setter
def stext(self, value):
obj = Foox.objects.get_or_create(foo=self, langu=settings.LANGUAGE_CODE)
obj.stext = value
obj.save()
不要这样导入,否则每次你得到unicode版本时它都会被导入,这可能是低效的。谢谢@PaulCollingwood,这只是一个实验,如果我决定使用这种方法,它将被重写。听起来像是你在寻找的。@KevinChristopherHenry,我看到了,但它需要在我的模型中创建这些字段。一个不是django管理的字段,我需要的可能不是属性。