2014-09-21 68 views
3

在我与烧瓶SQLAlchemy的烧瓶应用程序,我需要两个接触 此之间建立关联是我Contact模型自引用关联关系的SQLAlchemy

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

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) 

我有错误:

AttributeError: type object 'ContactRelation' has no attribute 'c' 

回答

4

感谢米歇尔和西门SQLAlchemy mailing list我需要association_proxy和两个关系联系关系。

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') 
0

看来,如果你改变了to_contacts喜欢的东西下面,您的问题将得到解决:

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

我删除.c问题没有解决 – itmard 2014-09-21 14:54:39

1

你们的关系是设计不正确。辅助应该是普通表,而不是映射类。如果你想在ContactRelation额外的数据(relation_type),你应该使用在SQLAlchemy的关系文档中描述的关联表的模式:http://docs.sqlalchemy.org/en/rel_1_1/orm/basic_relationships.html#association-object

+0

ContactRelation类是关联对象,我想创建两个联系对象之间的关联。这种模式有什么问题? – itmard 2014-09-22 20:27:02