Flask / SQLAlchemy - 一对一关系语法

时间:2015-05-26 02:19:06

标签: flask sqlalchemy flask-sqlalchemy

我有一个名为Subscription的Flask / SQLAlchemy模型,它与许多其他模型(订阅者,付款等)相关联。我现在必须配对两个订阅,其中一个订阅有时被称为“benefactor”,相对于另一个称为“收件人”的订阅。这是一个可选的一对一自引用模型。

当我尝试以下操作时:

class Base(db.Model):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)

class Subscription(Base):

    __tablename__ = 'subscriptions'
    benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id'))
    recipient = relationship('Subscription', uselist=False, backref='benefactor')

我收到错误:

Subscription.recipient and back-reference Subscription.benefactor are both
of the same direction symbol('ONETOMANY').  Did you mean to set remote_side
on the many-to-one side ?

这只适用于benefactor_id定义,但会在关系声明中中断。有什么建议?我不明白这个错误 - 从我的文档阅读中,uselist = False应该可以防止这个问题。

2 个答案:

答案 0 :(得分:2)

好的,我想出来了,但对解决方案并不是特别满意。

首先,我发现我必须在基类和派生类中重复'id'属性。我无法从基类移动它,因为它是由基类方法和许多其他派生类引用的,同时我无法从派生类引用基类声明,因此必须重新声明它(谁有更好的解决方案)?我希望我在SQLAlchemy中没有破坏任何东西 - 至少我的所有测试都通过了,尽管我很少喜欢这个解决方案。

第二,为了使一对一的自我指涉联系工作,我宣布了如下所示的关系。

class Base(db.Model):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)

class Subscription(Base):
    __tablename__ = 'subscriptions'
    id = db.Column(db.Integer, primary_key=True)
    benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id'))
    recipient = relationship('Subscription', uselist=False,
                              backref=db.backref('benefactor', remote_side=id))

答案 1 :(得分:-1)

错误表明您需要为关系设置remote_side关键字。你试过像这样设置吗?

class Subscription(Base):

__tablename__ = 'subscriptions'
benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id'))
recipient= relationship(
    'Subscription',
    uselist=False,
    remote_side=[id],
    backref='benefactor'
)