假设我有两个团队,"red"
和"black"
。假设我有一个Story
类,它以两种非常不同的方式呈现相似的信息,具体取决于您的团队:
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要求数据库字段是类变量而不是实例变量。你知道吗
所以。。。有没有办法在Django中创建这个make_fields
函数,还是我运气不好?你知道吗
不,Django模型不应该被视为可以动态构造的东西;它是数据库表的Python表示。例如,在运行
syncdb
之后更改specificName
格式的语义是什么?没有明确的,明显的答案-所以Django没有试图回答它。列是在类级别定义的,仅此而已。你知道吗(在某种程度上,您可以深入到内部ORM数据结构并设置这些字段—但您所做的只是将自己暴露在一个充满歧义和定义不明确的问题的世界中。不要这样做。)
不知道你为什么要这么做。更理智的模式是:
您当前的模型正在创建大量重复的列(对于红色和黑色),这些列只应由列本身定义。使用上面的模型,您的查询就像
Story.objects.filter(team="r")
。你知道吗这样就根本不需要
get_field
函数了。你知道吗相关问题 更多 >
编程相关推荐