这有效:
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
中看到它。
动态定义字段的好方法是什么?
答案 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模块显然可以用于完成相同的操作,但是我还没有尝试过。