Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 三重炼金术多对多关系_Python 2.7_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 2.7 三重炼金术多对多关系

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

我正在尝试为事件和事件RSVP创建数据库

对于每一个活动,都应该有可能的食物供rsvp选择

当用户选择RSVP时,为他们创建的RSVP模型应包含他们迄今为止选择的食物

这就是我到目前为止所做的:

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?