2015-07-11 27 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,因爲它允許我在「雙向」工作。謝謝閱讀!