python - Flask-SQLAlchemy 多对多

标签 python sqlalchemy flask-sqlalchemy

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

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

代码如下:

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

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

最佳答案

relationship(backref=...)构造是一种方便的机制,因此您可以获得指向两个方向的引用,Company.sectorsSector.companies 只定义了一个。您已经定义了这两种关系。你似乎已经明白了这一点;您的代码包含许多以注释形式出现的重复引用。

删除所有重复关系(您定义了相应的反向引用),您应该没问题。

或者,您可以使用 relationship(back_populates=...)显式地构建和定义所有关系。这样,您可以在每个类上看到它在类本身上具有什么样的集合属性,但它们将正确地绑定(bind)在一起。

关于python - Flask-SQLAlchemy 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476553/

相关文章:

python - Pandas:根据其他两列更改其中一列中的值的最有效方法

python - 嵌套棉花糖和 Sqlalchemy 包括子项

MySQL 从最后 N 组中选择所有行

postgresql - sqlalchemy/postgresql : database column computed default value

python - 如何在 SQLAlchemy(python,flask)中为模型用户自身创建多对多关系

python - 从 Python 文件中读取行的更好方法是什么?

python - 如何创建一个新表并指定一个time_partitioning_field?

python - 如何在 Pandas 数据框中找到每一行的顶部列值

python - Flask-SQLAlchemy:SQLALCHEMY_ENGINE_OPTIONS 设置不正确

python - 自定义 postgres 范围类型的 SQLalchemy 表示