2

そのため、翻訳可能なフィールドを保持する別のモデルの属性に似たモデルにプロパティを追加したいと考えています。

私のモデル:

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)

だから私は次のように書いた__init__

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が取得されます。mymodeltranslation.nameこの値を設定することもできます。

これを動的に作成してミックスインで使用できるようにしたいので、次のように 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 ループの実行ごとpropertyに値の名前を追加する必要があると思いました。nameしかし、そうではありません。呼び出すmymodel.nameと、モデル インスタンスが返されます (基本的にはself)。すべて手動ではなく forloop で実行すると、何が違うのかわかりません。

何か案は?

4

0 に答える 0