来自 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.sectors
和 Sector.companies
只定义了一个。您已经定义了这两种关系。你似乎已经明白了这一点;您的代码包含许多以注释形式出现的重复引用。
删除所有重复关系(您定义了相应的反向引用),您应该没问题。
或者,您可以使用 relationship(back_populates=...)
显式地构建和定义所有关系。这样,您可以在每个类上看到它在类本身上具有什么样的集合属性,但它们将正确地绑定(bind)在一起。
关于python - Flask-SQLAlchemy 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476553/