【发布时间】:2016-04-04 19:07:00
【问题描述】:
我见过一些与此类似的问题,但没有一个是一针见血的。本质上,我在使用 SQLAlchemy 的 Flask 应用程序中拥有三个表模型 Center()、Business() 和 CenterBusiness()。目前我正在以这种方式添加到上述关系中:
biz = Business(typId=form.type.data, name=form.name.data,
contact=form.contact.data, phone=form.phone.data)
db.session.add(biz)
db.session.commit()
assoc = CenterBusiness(bizId=biz.id, cenId=session['center'])
db.session.add(assoc)
db.session.commit()
如您所见,这有点难看,我知道有一种方法可以通过定义的关系一次性完成。我在 SQLAlchemy 的文档上看到他们对使用这样的表进行了解释,但我似乎无法让它工作。
#Directly from SQLAlchemy Docs
p = Parent()
a = Association(extra_data="some data")
a.child = Child()
p.children.append(a)
#My Version Using my Tables
center = Center.query.get(session['center']
assoc = CenterBusiness()
assoc.business = Business(typId=form.type.data, name=form.name.data,
contact=form.contact.data, phone=form.phone.data)
center.businesses.append(assoc)
db.session.commit()
不幸的是,这似乎不起作用...任何帮助将不胜感激,我在下面发布了所涉及的模型。
class Center(db.Model):
id = db.Column(MEDIUMINT(8, unsigned=True), primary_key=True,
autoincrement=False)
phone = db.Column(VARCHAR(10), nullable=False)
location = db.Column(VARCHAR(255), nullable=False)
businesses = db.relationship('CenterBusiness', lazy='dynamic')
employees = db.relationship('CenterEmployee', lazy='dynamic')
class Business(db.Model):
id = db.Column(MEDIUMINT(8, unsigned=True), primary_key=True,
autoincrement=True)
typId = db.Column(TINYINT(2, unsigned=True),
db.ForeignKey('biz_type.id',
onupdate='RESTRICT',
ondelete='RESTRICT'),
nullable=False)
type = db.relationship('BizType', backref='businesses',
lazy='subquery')
name = db.Column(VARCHAR(255), nullable=False)
contact = db.Column(VARCHAR(255), nullable=False)
phone = db.Column(VARCHAR(10), nullable=False)
documents = db.relationship('Document', backref='business',
lazy='dynamic')
class CenterBusiness(db.Model):
cenId = db.Column(MEDIUMINT(8, unsigned=True),
db.ForeignKey('center.id',
onupdate='RESTRICT',
ondelete='RESTRICT'),
primary_key=True)
bizId = db.Column(MEDIUMINT(8, unsigned=True),
db.ForeignKey('business.id',
onupdate='RESTRICT',
ondelete='RESTRICT'),
primary_key=True)
info = db.relationship('Business', backref='centers',
lazy='joined')
archived = db.Column(TINYINT(1, unsigned=True), nullable=False,
server_default='0')
【问题讨论】:
-
到底发生了什么?有错误吗?数据库的状态不是你期望的那样吗?
-
当我运行示例中所示的代码并阅读查询时,它似乎正在做大部分应该做的事情。但我从来没有看到插入语句,只是选择然后回滚,没有立即定义的原因。
-
我不确定它是否相关,但你可以configure the relationships so you don't need to work with the join tables directly。
children = relationship('Child', secondary=association_table) -
@dirn 这对于多对多来说是完美的,但据我所知,它不包括带有关联对象的真实表。
-
你是对的。您实际上想要Association Object 部分。
children = relationship('Association', back_populates='parent')
标签: python flask sqlalchemy many-to-many associations