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 之类的内容......`'
该relationship(backref=...)结构是一种便利的机制,因此您可以获得指向两个方向的引用,aCompany.sectors和 aSector.companies仅定义了一个。您已经定义了这两种关系。你似乎已经想到了这一点;您的代码包含许多注释掉形式的重复引用。
删除所有重复的关系(您已经定义了相应的 backref),您应该没问题。
或者,您可以使用relationship(back_populates=...)构造并明确定义所有的关系。这样,您可以在每个类上看到它在类本身上具有哪些类型的集合属性,但它们会正确绑定在一起。