python - 在 PonyORM 中找不到反向属性
问题描述
函数 generate_mapping 给出错误。我在两个模块中分别描述了模型。
我有一个模型:
# ./message/models.py
from pony import orm
from datetime import datetime
from db import db
model_names = ['Message', ]
class Message(db.Entity):
id = orm.PrimaryKey(int, auto=True)
time = orm.Required(datetime)
text = orm.Required(str)
user_from = orm.Required('User', cascade_delete=False)
user_to = orm.Required('User', cascade_delete=True)
还有一个:
# ./user/models.py
from pony import orm
from datetime import datetime
from db import db
model_names = ['User', ]
class User(db.Entity):
id = orm.PrimaryKey(int, auto=True)
login = orm.Required(str, unique=True)
pswdhash = orm.Required(str)
last_login = orm.Required(datetime)
is_active = orm.Required(bool, default=True)
程序的启动通过一个通用模块发生db.py
:
# ./db.py
from functools import reduce
from pony import orm
from settings import DATABASE, INSTALLED_APPS
db = orm.Database()
if DATABASE['engine'] == 'sqlite':
db.bind(provider='sqlite', filename=DATABASE['path'], create_db=True)
pkgs = reduce( # INSTALLED_APPS list
lambda value, item: value + [__import__(f'{item}.models')],
INSTALLED_APPS,
[],
)
modules = reduce( # pkg.models list
lambda value, item: value + [getattr(item, 'models', [])],
pkgs,
[],
)
mod_names = reduce( # models name in all pkg.models
lambda value, item: value + getattr(item, 'model_names', []),
modules,
[],
)
classes = dict() # dict with all models
for cn in mod_names:
for m in modules:
if cn in m.__dict__:
classes[cn] = m.__dict__[cn]
print(classes)
db.generate_mapping(create_tables=True)
当我在终端中运行程序时,我看到:
Traceback (most recent call last):
File "D:\Programming\Python\cpython\v372\Lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "D:\Programming\Python\cpython\v372\Lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File ".\__main__.py", line 8, in <module>
from db import db
File ".\db.py", line 37, in <module>
db.generate_mapping(create_tables=True)
File "D:\Envs\hwpy2\lib\site-packages\pony\orm\core.py", line 967, in generate_mapping
entity._link_reverse_attrs_()
File "D:\Envs\hwpy2\lib\site-packages\pony\orm\core.py", line 3893, in _link_reverse_attrs_
else: throw(ERDiagramError, 'Reverse attribute for %s not found' % attr)
File "D:\Envs\hwpy2\lib\site-packages\pony\utils\utils.py", line 106, in throw
raise exc
pony.orm.core.ERDiagramError: Reverse attribute for Message.user_from not found
导入模型正常
In [24]: classes
Out[24]: {'Message': messager.models.Message, 'User': users.models.User}
我究竟做错了什么?
解决方案
在 PonyORM 中,您应该从关系的两侧设置 reverse 属性。在您的情况下,您的User
模型应该是
class Message(db.Entity):
id = orm.PrimaryKey(int, auto=True)
time = orm.Required(datetime)
text = orm.Required(str)
user_from = orm.Required('User', cascade_delete=False, reverse='messages_sent')
user_to = orm.Required('User', cascade_delete=True, reverse='messages_recieved')
更多细节在这里
class User(db.Entity):
id = orm.PrimaryKey(int, auto=True)
login = orm.Required(str, unique=True)
pswdhash = orm.Required(str)
last_login = orm.Required(datetime)
is_active = orm.Required(bool, default=True)
messages_sent = Set('Message', reverse='user_from')
messages_recieved = Set('Message', reverse='user_to')
此外,由于您有 2 个链接,您应该准确指定要映射的属性。
推荐阅读
- wamp - Wamp:收到“配置失败”错误
- r - 在数据框中重新编码多个数值变量
- javascript - 如何用找到的不区分大小写的正则表达式替换匹配项,但扩展结果
- powershell - Powershell 查找和替换字符串
- excel - VBA 循环:如何将 Ticker 符号放入 Ticker 列?
- python - Python无法检查值是否在列表中
- jenkins-pipeline - docker-workflow-plugin (docker-pipeline-plugin) java.io.IOException: 无法 rm 容器
- tensorflow - 如何在我自己的数据集上使用 Tensorflow 的 cycleGAN
- php - Laravel Dusk - 需求无法解决?
- java - 无法覆盖 catch 块代码覆盖率