我正在尝试使用sqlalchemy设置基本的多对多关系,但无法确定我做错了什么。基本上,我有一个用户表和一个Offer表(基本上像Groupon这样的表)。用户可以响应许多优惠,而优惠可以发送给很多用户。我一直在使用sqlalchemy docs的这一部分,但显然我做错了什么。
这里是我的代码的相关章节:当尝试设置多对多关联对象时,backref上的关键错误
class Offer(db.Model):
__tablename__ = 'offers'
id = Column(Integer, primary_key=True)
title = Column(String)
description = Column(String)
users = association_proxy('user_offers', 'user')
def __init__(self, title, description):
self.title = title
self.description = description
class User(db.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
first_name = Column(String, nullable=False)
last_name = Column(String, nullable=False)
email = Column(String, index=True, unique=True)
def __init__(self, first_name, last_name, email):
self.first_name = first_name
self.last_name = last_name
self.email = email.lower()
class UserOfferResponse(db.Model):
__tablename__ = 'user_offer_responses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
offer_id = Column(Integer, ForeignKey('offers.id'))
response = Column(String)
created_at = Column(DateTime)
offer = relationship(Offer,
backref=backref("user_offers",
cascade="all, delete-orphan")
)
user = relationship("User")
def __init__(self, offer=None, user=None, response="", created_at=datetime.datetime.now()):
self.response = response
self.offer = offer
self.user = user
self.created_at = created_at
使用上面的代码,我可以创建报价和用户,但如果我尝试两个(offer.users.append(user)
)我得到以下错误关联:
File "/Users/scottmorse/.virtualenvs/WhereItsApp/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 224, in __set__
instance_dict(instance), value, None)
File "/Users/scottmorse/.virtualenvs/WhereItsApp/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 802, in set
value = self.fire_replace_event(state, dict_, value, old, initiator)
File "/Users/scottmorse/.virtualenvs/WhereItsApp/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 824, in fire_replace_event
self._replace_token or self._init_append_or_replace_token())
File "/Users/scottmorse/.virtualenvs/WhereItsApp/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1153, in emit_backref_from_scalar_set_event
child_impl = child_state.manager[key].impl
KeyError: 'user_offers'
任何帮助将不胜感激,并感谢您的阅读。
我有一个类似的问题,我通过在您的案例UserOfferResponse中将关系直接添加到关联对象来入侵它。我的回答似乎不正确,虽然它与https://github.com/miguelgrinberg/flasky在models.py中的作用相似。以User - Follows关系为例。 – darwindave