我想要实现的结构是, 我们有一个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='Language')
我将使用Foox模型拥有Foo模型stext字段, 当我激活'en'语言,并在模板或代码中使用Foo的stext字段时,
假设我在模板中使用了{{Foo.stext}}。价值将使用 Foox.objects.get(foo = foo,langu ='en')。values('stext')[0] ['stext']
如果我在我的代码中写了foo.stext。我的模型应该知道stext是一个属性,来自Foox模型。
到目前为止,我使用以下代码为 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.
我的方法是否正确,是否有更好的方法可以做到这一点。我实际上需要一种方法来定义一个查询其他模型的字段。并且不存在于db中。只是占位符或其他东西。
我们有模特管理员和班级方法,我只是无法弄明白。
我知道其他多种方法,请不要建议我使用它们。
答案 0 :(得分:0)
您可以使用@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()