现在我有了这段代码:
class Mymodel(models.Model):
xxxx_count = ForeignCountField(filter={'foreign_table__xxxx': True})
yyyy_count = ForeignCountField(filter={'foreign_table__yyyy': True})
zzzz_count = ForeignCountField(filter={'foreign_table__zzzz': True})
qqqq_count = ForeignCountField(filter={'foreign_table__qqqq': True})
ssss_count = ForeignCountField(filter={'foreign_table__ssss': True})
rrrr_count = ForeignCountField(filter={'foreign_table__rrrr': True})
我想要这样的事情:
class Mymodel(models.Model):
for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
setattr(self, '%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True}))
但是当我尝试这样做时,错误提出:“自我没有定义”。我是否需要将此代码放入其他地方?
答案 0 :(得分:1)
自动创建多个类属性的方法是编写元类。当然可以继承Django的ModelBase元类并添加你需要的功能;但它也可能过度杀伤,而且可能不如仅仅写出来那么可维护。
答案 1 :(得分:1)
我想了解更多有关设计决策的信息。什么是ForeignCountField,为什么需要它?它不应该是各自表的财产吗? (管理者或类方法的方法?)
答案 2 :(得分:1)
如果要在模型定义之外添加字段,则必须使用add_to_class
模型方法:
class Mymodel(models.Model):
pass
for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
Mymodel.add_to_class('%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True})))
答案 3 :(得分:-1)
也许您需要将代码放在类的构造函数方法 init 中。
def __init__(self, *args, **kwargs):
.....
super(MyModel, self).__init__(*args, **kwargs)
修改:抱歉这不起作用。也许你可以尝试查看This,'这适用于django 0.96。有一些修改使得难以使用django版本1.0'进行调整。
如果你不喜欢Dirty and Quick你可以尝试这样的事情:
class Foo(models.Model):
letters = ["A", "B", "C"]
for l in letters:
exec "%s_count = models.CharField(max_length=255)" % l