gpt4 book ai didi

python-2.7 - peewee:重用动态创建的模型

转载 作者:行者123 更新时间:2023-12-04 02:04:32 27 4
gpt4 key购买 nike

在我的应用程序中,我有一个模型,我只在运行时知道它的列数。使用像下面的 Factory 这样的函数来创建模型很好地解决了这个问题。但是,如果我多次使用它(具有可能不同的字段),外键 ref 的创建会引发异常:

AttributeError: Foreign key: dynamictable.ref related name "dynamictable_set" 
collision with foreign key using same related_name.

消息很清楚,当我在创建外键时设置 related_name 参数时没有错误。

问题:

  1. 为什么我不能第二次使用相同的related_name?我是否也需要重新定义 StaticTable

  2. 是否有更好的方法来使用动态模型写入多个数据库?

最小的、可重现的例子:

import peewee

database_proxy = peewee.Proxy()

class BaseModel(peewee.Model):
class Meta:
database = database_proxy

class StaticTable(BaseModel):
foo = peewee.DoubleField()

def Factory(fields):
class DynamicTable(BaseModel):
ref = peewee.ForeignKeyField(StaticTable)
for field in fields:
peewee.DoubleField().add_to_class(DynamicTable, field)
return DynamicTable

def Test(fname, fields):
db = peewee.SqliteDatabase(fname)
database_proxy.initialize(db)
db.create_table(StaticTable)
dyntable = Factory(fields)
db.create_table(dyntable)
db.close()


Test(':memory:', ['foo', 'bar'])
Test(':memory:', ['foo', 'bar', 'extra'])

最佳答案

我认为这突出了 peewee 中的一个错误,您可能会明确地希望忽略任何反向引用。我已开具工单并会解决它。

https://github.com/coleifer/peewee/issues/465

与此同时,您可以通过在模型上设置动态 related_name 来消除错误,例如

def Factory(fields):
dynamic_name = '_'.join(fields)
class DynamicTable(BaseModel):
ref = peewee.ForeignKeyField(StaticTable, related_name=dynamic_name)
for field in fields:
peewee.DoubleField().add_to_class(DynamicTable, field)
return DynamicTable

更新:根据 #465 中的修复,现在可以禁用 backref 验证:

def Factory(fields):
class DynamicTable(BaseModel):
ref = peewee.ForeignKeyField(StaticTable, related_name=dynamic_name)
class Meta:
validate_backrefs = False
for field in fields:
peewee.DoubleField().add_to_class(DynamicTable, field)
return DynamicTable

关于python-2.7 - peewee:重用动态创建的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27000279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com