私には2つのチームがあるとしましょ"red"
う"black"
。Story
そして、あなたのチームに応じて、2つの非常に異なる方法で同様の情報を提示するクラスがあるとしましょう。
class Story(models.Model):
red_title = models.CharField()
black_title = models.CharField()
red_prologue = models.TextField()
black_prologue = models.TextField()
# ... and so on ...
def get_field(self, genericName, team):
"""Return the field with suffix genericName belonging to the given team.
>>>self.get_field("prologue", "red") is self.red_prologue
True
>>>self.get_field("title", "black") is self.black_title
True
"""
assert(team in ["red", "black"])
specificName = "{}_{}".format(team, genericName)
return self.__dict__[specificName]
getter関数には満足していますが、最初にフィールドを作成したコードをリファクタリングできるはずだと思います。次のような関数が欲しいのですが。
def make_fields(self, genericName, fieldType, **kwargs):
"""Create two fields with suffix genericName.
One will be 'red_{genericName}' and one will be 'black_{genericName}'.
"""
for team in ["red", "black"]:
specificName = "{}_{}".format(team, genericName)
self.__dict__[specificName] = fieldType(**kwargs)
しかしself
、__dict__
クラスが最初に定義されている間は意味がありません。Djangoでは、データベースフィールドがインスタンス変数ではなくクラス変数である必要があると思います。
だから... make_fields
Django内でこの関数を作成する方法はありますか、それとも私は運が悪いですか?