django模型方法的行为类似于字段

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='

我想要实现的结构是, 我们有一个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模型

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管理的字段,我需要的可能不是属性。