在peewee模型中动态定义字段

4 投票
2 回答
2997 浏览
提问于 2025-04-17 21:59

这个是可以工作的:

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

撰写回答