Python 2.7 三重炼金术多对多关系
我正在尝试为事件和事件RSVP创建数据库 对于每一个活动,都应该有可能的食物供rsvp选择 当用户选择RSVP时,为他们创建的RSVP模型应包含他们迄今为止选择的食物 这就是我到目前为止所做的:Python 2.7 三重炼金术多对多关系,python-2.7,flask,flask-sqlalchemy,Python 2.7,Flask,Flask Sqlalchemy,我正在尝试为事件和事件RSVP创建数据库 对于每一个活动,都应该有可能的食物供rsvp选择 当用户选择RSVP时,为他们创建的RSVP模型应包含他们迄今为止选择的食物 这就是我到目前为止所做的: event_meals = db.Table('event_meals', db.Column('meal_id', db.Integer, db.ForeignKey('meal.id')), db.Colum
event_meals = db.Table('event_meals',
db.Column('meal_id', db.Integer, db.ForeignKey('meal.id')),
db.Column('event_id', db.Integer, db.ForeignKey('event.id')))
rsvp_meals = db.Table('rsvp_meals',
db.Column('meal_id', db.Integer, db.ForeignKey('meal.id')),
db.Column('rsvp_id', db.Integer, db.ForeignKey('rsvp.id')))
class Event(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(256), unique=True)
date = db.Column(db.String(128))
photo = db.Column(db.String(256))
info = db.Column(db.String(1024))
meals = db.relationship('Meal', secondary='event_meals',
backref=db.backref('meals', lazy='dynamic'))
def __repr__(self):
return self.title
class Rsvp(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
price = db.Column(db.String(64))
meals = db.relationship('Meal', secondary='rsvp_meals',
backref=db.backref('meals', lazy='dynamic'))
def __repr__(self):
return self.name
class Meal(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
price = db.Column(db.Integer)
qty = db.Column(db.Integer)
def __repr__(self):
return self.title
毫不奇怪,这会产生一个错误:
sqlalchemy.exc.ArgumentError:在关系“Rsvp.fines”上创建backref“fines”时出错:映射程序“mapper | fine | fine”上存在该名称的属性
谁能帮我做这件事?!非常感谢您的帮助
backref
是应用于在相关模型上公开多对多关系的名称。在您的例子中,您是说事件
和Rsvp
模型都应该作为膳食
模型上的属性膳食
公开。换句话说,当我有一顿饭
并且我想知道谁有RSVP'd时,我应该访问饭
实例上的饭
属性。但是,您还声明,如果我想查看与膳食相关的事件
s,我应该访问膳食的膳食
属性。。。这就是SQLAlchemy抛出错误的原因
您最可能的意思是在餐点上公开rsvps
和事件
:
class Event(db.Model):
# ... snip ...
meals = db.relationship('Meal', secondary='event_meals',
backref=db.backref('events', lazy='dynamic'))
# ... snip ...
class Rsvp(db.Model):
# ... snip ...
meals = db.relationship('Meal', secondary='rsvp_meals',
backref=db.backref('rsvps', lazy='dynamic'))
然后,对于任何用餐
实例,您可以查询其事件
s和RSVP
s:
for rsvp in Meal.query.get(meal_id).rsvps:
print rsvp.name
需要注意的关键是SQLAlchemy是一个非常枯燥(不要重复)的框架。如果您发现自己必须在同一字段的声明的不同部分之间保持名称的同步,那么您可能缺少了一种更简单的方法。您让肖恩大吃一惊!很好的解释,效果很好。谢谢你,伙计!这真的是最好的方法吗?为什么你不做一个典型的三向连接表?@applewood-这可能不是最好的方法-问题是为什么OP会有这样的问题。一个包含事件id
,用餐id
,rsvp\u id
的表格可能更有意义(取决于用例)。如果用餐本身重复出现,上述案例是否有效。例如,吃饭1出现在事件1和事件2中,rsvp 1和rsvp 2有吃饭1。我尝试了上面的命令:AttributeError:type对象“Rating”没有属性“get”。我如何定义get?