django模型方法表现得像一个字段

时间:2016-05-21 10:59:31

标签: 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='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中。只是占位符或其他东西。

我们有模特管理员和班级方法,我只是无法弄明白。

我知道其他多种方法,请不要建议我使用它们。

1 个答案:

答案 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()