在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 个回答
2
这篇帖子主要是为了强调一下AidanGawronski给出的正确答案,适用于Peewee 3.?(测试日期是2020年5月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模块似乎也可以用来完成同样的事情,不过我还没有尝试过。
17
不要使用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