动态定义peewee模型中的字段

时间:2014-03-12 16:53:07

标签: python peewee

这有效:

class MyModel(peewee.Model):
    my_field = peewee.IntegerField(null=False, default=0)

    class Meta(object):
        database = db
        db_table = 'MyTable'

这不起作用:

class MyModel(peewee.Model):

    class Meta(object):
        database = db
        db_table = 'MyTable'

setattr(MyModel, 'my_field', peewee.IntegerField(null=False, default=0))

我想这是由于peewee.Model中的一些元类魔法造成的。实际上,我无法在模型_meta.fields中看到它。

动态定义字段的好方法是什么?

2 个答案:

答案 0 :(得分:16)

而不是setattr,请致电add_to_class

my_field = peewee.IntegerField(null=False, default=0)
my_field.add_to_class(MyModel, 'my_field_name')

# Now this works:
MyModel.my_field_name

答案 1 :(得分:1)

本文旨在突出AidanGawronski对Peewee 3的正确回答? (测试2020-05-18)。

以下代码成功:

class Note(Model):
    note_id = AutoField()
fields=('nx', 'ny', 'nz')
for f in fields:
    Note._meta.add_field(f, TextField(null=False))

Peewee的migrate模块显然可以用于完成相同的操作,但是我还没有尝试过。