来自Django,我很难弄清多对多关系的工作原理。
以下models.py无法正常工作,出现错误:InvalidRequestError:一个或多个映射器无法初始化-无法继续进行其他映射器的初始化。最初的例外是:在关系'Sector.companies'上创建backref'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=...)
构造是一种方便的链式机制,因此您可以获取指向两个方向的引用,aCompany.sectors
和aSector.companies
仅定义了一个。您已经定义了两个关系。您似乎已经知道了这一点;您的代码包含很多重复注释的引用。
删除所有重复的关系(在其中定义了相应的backref的地方),您应该会很好。
或者,您可以使用该relationship(back_populates=...)
构造并显式定义所有房地产。这样,您可以在每个类上看到它对类本身具有什么样的集合属性,但是它们将被正确地捆绑在一起。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句