Flask-SQLAlchemy 多对多

fre*_*row 2 python sqlalchemy flask-sqlalchemy

来自 Django,我很难弄清楚多对多关系是如何工作的。

以下models.py 不起作用,我收到错误消息:InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。原始异常是:在关系“Sector.companies”上创建反向引用“扇区”时出错:映射器“Mapper|Company|companys”上存在该名称的属性

代码如下:

`    
company_contacts = db.Table('company_contacts',
                       db.Column('company_id', db.Integer, db.ForeignKey('companies.id')),
                       db.Column('contact_id', db.Integer, db.ForeignKey('contacts.id'))
                       )


company_sectors = db.Table('company_sectors',
                   db.Column('company_id', db.Integer, db.ForeignKey('companies.id')),
                   db.Column('sector_id', db.Integer, db.ForeignKey('sectors.id'))
                   )

company_worklists = db.Table('company_worklists',
                   db.Column('company_id', db.Integer, db.ForeignKey('companies.id')),
                   db.Column('worklist_id', db.Integer, db.ForeignKey('worklists.id'))
                   )


class Sector(db.Model):

    __tablename__ = 'sectors'
    id = db.Column(db.Integer, primary_key = True)
    name_srb= db.Column(db.String(64), unique = True)
    name_ita= db.Column(db.String(64), unique = True)

    companies = db.relationship('Company',
                           secondary = company_sectors,
                           backref = db.backref('sectors', lazy = 'dynamic'),
                           lazy = 'dynamic')



class Contact(db.Model):

    __tablename__ = 'contacts'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = False)
    last_name = db.Column(db.String(64), unique = False)
    position_srb = db.Column(db.String(64), unique = False)
    position_ita = db.Column(db.String(64), unique = False)
    email = db.Column(db.String(120), unique = True)
    phone = db.Column(db.String(100))
    created = db.Column(db.DateTime(), default=datetime.now)
    updated = db.Column(db.DateTime(), default=datetime.now,onupdate=datetime.now)

    #companies = db.relationship('Company',
                           #secondary = company_contacts,
                           #backref = db.backref('companies', lazy = 'dynamic'),
                           #lazy = 'dynamic')



class WorkList(db.Model):

    __tablename__ = 'worklists'
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(64), unique = True)
    created = db.Column(db.DateTime(), default = datetime.now)
    updated = db.Column(db.DateTime(), default=datetime.now,onupdate=datetime.now)
    slug =  db.Column(db.String(100), unique = True)


class Company(db.Model):

    __tablename__ = 'companies'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    address = db.Column(db.String(120), unique = False)
    website = db.Column(db.String(100), unique = False)
    city = db.Column(db.String(20), unique = False)
    desc = db.Column(db.Text())
    email = db.Column(db.String(120), unique = True)
    created = db.Column(db.DateTime(), default=datetime.now)
    updated = db.Column(db.DateTime(), default=datetime.now,onupdate=datetime.now)
    slug =  db.Column(db.String(100), unique = True)
    phone = db.Column(db.String(100))
    fax = db.Column(db.String(100), unique = False)



    contacts = db.relationship('Contact',
                           secondary = company_contacts,
                           backref = db.backref('contacts', lazy = 'dynamic'),
                           lazy = 'dynamic')

    sectors = db.relationship('Sector',
                           secondary = company_sectors,
                           backref = db.backref('sectors', lazy = 'dynamic'),
                           lazy = 'dynamic')


    wlists= db.relationship('WorkList',
                           secondary = company_worklists,
                           backref = db.backref('wlists', lazy = 'dynamic'),
                           lazy = 'dynamic')
Run Code Online (Sandbox Code Playgroud)

我希望能够访问 Company.contacts 和 Contact.companies 之类的内容......`'

Sin*_*ion 5

relationship(backref=...)结构是一种便利的机制,因此您可以获得指向两个方向的引用,aCompany.sectors和 aSector.companies仅定义了一个。您已经定义了这两种关系。你似乎已经想到了这一点;您的代码包含许多注释掉形式的重复引用。

删除所有重复的关系(您已经定义了相应的 backref),您应该没问题。

或者,您可以使用relationship(back_populates=...)构造并明确定义所有的关系。这样,您可以在每个类上看到它在类本身上具有哪些类型的集合属性,但它们会正确绑定在一起。