Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向可翻译的Django模型动态添加属性_Python_Django_Properties_Model - Fatal编程技术网

Python 向可翻译的Django模型动态添加属性

Python 向可翻译的Django模型动态添加属性,python,django,properties,model,Python,Django,Properties,Model,因此,我想向一个模型添加属性,类似于另一个模型的属性,该模型包含可翻译字段 我的模型: class MyModel(models.Model): ... fields ... class MyModelTranslation(models.Model): ... the fields I want on MyModel ... name = models.CharField() city = models.CharField() language = m

因此,我想向一个模型添加属性,类似于另一个模型的属性,该模型包含可翻译字段

我的模型:

class MyModel(models.Model):
    ... fields ...

class MyModelTranslation(models.Model):
    ... the fields I want on MyModel ...
    name = models.CharField()
    city = models.CharField()
    language = models.CharField()
    mymodel = models.ForeignKey(MyModel)
所以我写了下面的
\uuuu init\uuuu

class MyModel(models.Model):

    ...

    def __init__(self, *args, **kwargs):
        super(Model, self).__init__(*args, **kwargs)
        # get_translation gets the object, that holds the translation fields for the
        # current active language
        trans = lambda c: c.get_translation()

        setattr(self.__class__, 'translation', property(trans))

        fget = lambda c: getattr(trans(c), 'name')
        fset = lambda c, v: setattr(trans(c), 'name', v)
        setattr(self.__class__, 'name', property(fget, fset))

        fget = lambda c: getattr(trans(c), 'city')
        fset = lambda c, v: setattr(trans(c), 'city', v)
        setattr(self.__class__, 'city', property(fget, fset))
这很好用。然后,当我调用
mymodel.name
时,我得到了活动语言的
mymodeltransformation.name
。也可以设置此值

因为我想动态地创建它,以便在mixin中使用它,所以我将它添加到for循环中,如下所示:

   def __init__(self, *args, **kwargs):
        super(Model, self).__init__(*args, **kwargs)
        trans = lambda c: c.get_translation()
        setattr(self.__class__, 'translation', property(trans))

        # returns all fields of the translation model
        trans_fields = [field.name for field in [
            related for related in self._meta.get_all_related_objects()
            if "translation" in related.name
        ][0].model._meta.fields]

        # should then assign all those fields dynamically
        for name in trans_fields:
            if not name == 'id' and not name == 'mymodel':
                fget = lambda c: getattr(trans(c), name)
                fset = lambda c, v: setattr(trans(c), name, v)
                setattr(self.__class__, name, property(fget, fset))
所以我想,好吧,因为
name
值类似于我以前手动添加的字段名称,所以它应该在for循环的每次运行中添加一个
属性,其名称为
name
。 但事实并非如此。当我调用
mymodel.name
时,它返回模型实例(因此基本上
self
)。我不知道有什么不同,当我在forloop中而不是全部手动执行时


有什么想法吗?

你可以用django transmeta之类的东西。。。。有一些关于此问题的应用程序