使用新添加的字段/列更新模型

时间:2017-12-31 03:41:38

标签: python model field migrate peewee

Python应用程序,使用peewee处理SQLite数据库。

我的这个模型包含一个字段:

class RepUser(Model):
    user = BigIntegerField()

我使用这样的迁移器更新数据库模式:

new_field = IntegerField(null=True)
migrate(migrator.add_column('repuser', 'abc', new_field))

我预计模型会更新其字段以适应插入的额外字段,但事实并非如此。

例如,这给出了一个KeyError:

model_instance.abc = 42

目标是能够动态添加和删除字段,并让模型更新以便可以使用它们。

我在这里找到了一个相关的问题:Update existing table/model column/fields?

最佳答案说,在向数据库架构添加字段后,还必须更新模型,但我不知道如何执行此操作,并且无法在文档中找到相关信息。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,万一有人将来偶然发现这个问题。

Field基类有一个名为add_to_class的实例方法,它正是我想要的。

所以你可以做到

new_field = SomeField()
new_field.add_to_class(model_class, 'column_name')

请注意,当您连接到数据库时,您必须获取所有列并手动将它们添加到模型库中。我在连接数据库后立即执行此操作:

for index, column_name in enumerate(database.get_columns('table_name')):
    if (index < 2): # 2 is in my case how many columns I have that are 'static'
        continue
    new_field = SomeField()
    new_field.add_to_class(table_name, column_name)

显然你必须改变细节。

在afaik文档中没有提到这一点。我确实不得不查看源代码来找到这种方法。

对不起,如果我的术语有点不对,我对python来说比较新。

答案 1 :(得分:0)

在3.0a中,您将使用Model._meta.add_field()方法:

class User(Model):
    pass

f = TextField()
User._meta.add_field('username', f)

print(User._meta.fields)
# {'id': <peewee.AutoField at 0x7f552815bc50>,
#  'username': <peewee.TextField at 0x7f552b1d7e10>}