首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自指关联关系SQLalchemy

自指关联关系SQLalchemy
EN

Stack Overflow用户
提问于 2014-09-21 12:00:42
回答 4查看 2.2K关注 0票数 6

在我使用烧瓶-sqlalchemy的烧瓶应用程序中,我需要在两个联系人之间创建关联,这里是我的Contact模型。

代码语言:javascript
运行
复制
class Contact(db.Model):
    __tablename__ = 'contact'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(120), nullable=False, unique=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    to_contacts = db.relationship('Contact',
                                  secondary='ContactRelation',
                                  primaryjoin='id==contactrelation.c.from_contact_id',
                                  secondaryjoin='id==contactrelation.c.to_contact_id',
                                  backref='from_contacts')

还有我的关联类ContactRelation

代码语言:javascript
运行
复制
class ContactRelation(db.Model):
    __tablename__ = 'contactrelation'
    id = db.Column(db.Integer, primary_key=True)
    from_contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
    to_contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
    relation_type = db.Column(db.String(100), nullable=True)

我有错误:

代码语言:javascript
运行
复制
AttributeError: type object 'ContactRelation' has no attribute 'c'
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-29 06:53:01

感谢SQLAlchemy邮件列表上的米歇尔和西蒙,我需要association_proxy和两个联系关系。

代码语言:javascript
运行
复制
class Contact(db.Model):
    __tablename__ = 'contact'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(120), nullable=False, unique=False)
    created_on = db.Column(db.DateTime, default=datetime.utcnow)
    birthday = db.Column(db.DateTime)
    background = db.Column(db.Text)
    photo = db.Column(db.Unicode(120))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    to_contacts = association_proxy('to_relations', 'to_contact')
    from_contacts = association_proxy('from_relations', 'from_contact')

class ContactRelation(db.Model):
    __tablename__ = 'contactrelation'
    id = db.Column(db.Integer, primary_key=True)
    from_contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
    to_contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
    relation_type = db.Column(db.String(100), nullable=True)

    from_contact = db.relationship(Contact,
                                   primaryjoin=(from_contact_id == Contact.id),
                                   backref='to_relations')
    to_contact = db.relationship(Contact,
                                 primaryjoin=(to_contact_id == Contact.id),
                                 backref='from_relations')
票数 8
EN

Stack Overflow用户

发布于 2020-06-09 11:13:19

与关联对象的自引用多到多关系。

用户类别:

代码语言:javascript
运行
复制
class User(Base):
    __tablename__ = "User"
    id = Column(String(36), primary_key=True, default=lambda : str(uuid1()))

协会班:

代码语言:javascript
运行
复制
class UserIgnore(Base):
    __tablename__ = "UserIgnore"
    id = Column(String(36), primary_key=True, default=lambda : str(uuid1()))

    ignored_by_id = Column("ignored_by_id", String(36), ForeignKey("User.id"), primary_key=True)
    ignored_by = relationship("User", backref="ignored_list",  primaryjoin=(User.id == ignored_by_id))
    ignored_id = Column("ignored_id", String(36), ForeignKey("User.id"), primary_key=True)
    ignored = relationship("User", backref="ignored_by_list",  primaryjoin=(User.id == ignored_id))

访问关系对象。

代码语言:javascript
运行
复制
someUser.ignored_list

代码语言:javascript
运行
复制
someUser.ignored_by_list

多亏了肖恩

票数 2
EN

Stack Overflow用户

发布于 2014-09-21 15:12:32

你们的关系设计得不对。辅助类应该是普通表,而不是映射类。如果您希望在您的relation_type上获得额外的数据( ContactRelation ),您应该使用SQLAlchemy Relationship docs:relationships.html#association-object中描述的关联表模式

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25958963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档