【问题标题】:Dynamically define fields in a peewee model在 peewee 模型中动态定义字段
【发布时间】:2014-04-16 23:58:22
【问题描述】:

这行得通:

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里看不到。

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

【问题讨论】:

    标签: python peewee


    【解决方案1】:

    调用add_to_class,而不是setattr:

    my_field = peewee.IntegerField(null=False, default=0)
    my_field.add_to_class(MyModel, 'my_field_name')
    
    # Now this works:
    MyModel.my_field_name
    

    【讨论】:

    • 显然现在是:Model._meta.add_field(field_name, field)
    【解决方案2】:

    这篇文章只是为了突出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 模块显然可以用来完成同样的事情,但我没有尝试过。

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多