2015-07-11 30 views
2

我正在尝试使用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' 

任何帮助将不胜感激,并感谢您的阅读。

+0

我有一个类似的问题,我通过在您的案例UserOfferResponse中将关系直接添加到关联对象来入侵它。我的回答似乎不正确,虽然它与https://github.com/miguelgrinberg/flasky在models.py中的作用相似。以User - Follows关系为例。 – darwindave

回答

1

在这里找到了答案:KeyError when adding objects to SQLAlchemy association object

因为我试图将用户添加到报价的名单,我需要:1)确保用户是传递给UserOfferResponse构造函数中的第一项(因为这它是如何被association_proxy调用的,或者2)在association_proxy中添加一个显式的'creator'参数。

我选择了选项2,因为它允许我在“双向”工作。谢谢阅读!