2009-04-28 92 views
0

现在我有这样的代码:是否可以动态定义模型字段的名称?

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})) 

但是,当我尝试这样做,提出了错误:“自不定义”。我需要将这些代码放到其他地方吗?

回答

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}))) 
-1

也许你需要把你的代码放在你的类的构造方法init

def __init__(self, *args, **kwargs): 
    ..... 
    super(MyModel, self).__init__(*args, **kwargs) 

编辑:对不起这不工作。也许你可以试试看This,'这个工程与Django的0.96。有一些修改,很难用django 1.0版来调整它。

,如果你wan't它肮脏和快速,你可以尝试这样的事:

class Foo(models.Model): 
    letters = ["A", "B", "C"] 
    for l in letters: 
     exec "%s_count = models.CharField(max_length=255)" % l 
+0

什么__init __内定义之间的差异()或外__init__ ()。只有自变量的确定性? – ramusus 2009-04-28 09:33:44

+0

是的,在__init__自我存在,外面没有。 – 2009-04-28 09:35:28

+0

我更新了我的回复。 – 2009-04-28 09:47:01

1

的方式自动多类创建属性是通过写元类。继承Django的ModelBase元类并添加你需要的功能当然是可能的;但它也可能是过度杀伤性的,并且可能比仅仅写出它们更难以维护。

1

我想了解更多关于设计决策的信息,让您了解了这一点。什么是ForeignCountField,您为什么需要它?它不应该是相应表格的属性吗? (在经理或类方法的方法?)

相关问题