そのため、翻訳可能なフィールドを保持する別のモデルの属性に似たモデルにプロパティを追加したいと考えています。
私のモデル:
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 で実行すると、何が違うのかわかりません。
何か案は?