Flask/SQLAlchemy-一对一关系语法

Flask/SQLAlchemy-一对一关系语法,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个名为Subscription的Flask/SQLAlchemy模型,它与许多其他模型(订阅者、付款等)相关联。我现在必须配对两个订阅,其中一个订阅有时被称为“赞助者”,而另一个订阅被称为“接收者”。这是一个可选的一对一自参考模型 当我尝试以下方法时: class Base(db.Model): __abstract__ = True id = db.Column(db.Integer, primary_key=True) class Subscription(Base)

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

当我尝试以下方法时:

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应该可以防止这个问题。

错误说明需要为关系设置
remote\u-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'
)

好吧,我知道了,但我对解决方案不是特别满意

首先,我发现我必须在基类和派生类中重复'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))

此时此字段似乎不可供引用,因为该表是自引用的:“AttributeError:“table”对象没有属性“id””订阅表中没有id?我本以为应该使用benefactor_id。我的基类中确实有id:class base(db.Model):abstract=True id=db.Column(db.Integer,primary\u key=True)benefactor\u id是外键。尝试将id字段添加到模型中,看看它是否有效;我已经更新了原始问题,以澄清这一点。我很抱歉没有包括基类decl。我也尝试了引用id-当我声明“recipient=relationship('Subscription',uselist=False,backref='benefor',remote_side='subscriptions.id')”时的错误是:AttributeError:'Table'对象没有属性'id'