FlaskSqlAlchemy自参考多个关联对象

2024-10-02 00:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用炼金术建立一个用户友谊机制。我想要一个“boss-employee relationship”对象,这样它就可以有一些其他属性,比如日期、昵称等等,并维护员工的工作树

我意识到实现这一点的最佳方法是使用关联对象连接到用户模型的自引用多对多关系。这些模型似乎有效,但我似乎无法实际使用它们添加数据

有人能告诉我怎么修理这个吗?谢谢大家!

这就是我在解释器中运行以添加关系的内容,每次它都会崩溃:

from questionary import create_app
app = create_app()
app.app_context().push()
from questionary import db
db.create_all()
from questionary.models import *
s, m = User.query.all()[0], User.query.all()[-1]
r = RelationshipObject(slave=s, master=m)
db.session.add(r)
db.session.commit()

错误如下:

ProgrammingError                          Traceback (most recent call last)
d:\project\venv\lib\site-packages\sqlalchemy\engine\base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1247                     self.dialect.do_execute(
-> 1248                         cursor, statement, parameters, context
   1249                     )

d:\project\venv\lib\site-packages\sqlalchemy\engine\default.py in do_execute(self, cursor, statement, parameters, context)
    589     def do_execute(self, cursor, statement, parameters, context=None):
--> 590         cursor.execute(statement, parameters)
    591 

ProgrammingError: can't adapt type 'User'

The above exception was the direct cause of the following exception:

(...long recursion error traceback here...)

d:\project\venv\lib\site-packages\sqlalchemy\engine\default.py in do_execute(self, cursor, statement, parameters, context)
    588
    589     def do_execute(self, cursor, statement, parameters, context=None):
--> 590         cursor.execute(statement, parameters)
    591
    592     def do_execute_no_params(self, cursor, statement, context=None):

<class 'str'>: (<class 'RecursionError'>, RecursionError('maximum recursion depth exceeded in __instancecheck__'))

这些是我的模型,我正在使用一个包结构的flask模型,并从树库运行

class RelationshipObject(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    slave = db.Column(db.Integer, db.ForeignKey(
        'user.id'), primary_key=True)
    master = db.Column(db.Integer, db.ForeignKey(
        'user.id'), primary_key=True)
    relationship_time = db.Column(
        db.DateTime, nullable=False, default=dt.utcnow)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    slaves = db.relationship('RelationshipObject', backref='slaves',
                             primaryjoin=(id == RelationshipObject.slave))
    masters = db.relationship('RelationshipObject', backref='masters',
                              primaryjoin=(id == RelationshipObject.master))

Tags: 模型selfidtrueappexecutedbcontext

热门问题