python - 尝试设置多对多关联对象时 backref 上的关键错误

标签 python postgresql flask sqlalchemy

我正在尝试使用 sqlalchemy 建立基本的多对多关系,但无法确定我做错了什么。本质上,我有一张用户表和一张报价表(基本上,类似于 Groupon)。用户可以响应多个优惠,优惠可以发送给多个用户。我一直在使用 sqlalchemy docs 的这一部分但显然我做错了什么。
这是我的代码的相关部分:

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 和一个 User,但是如果我尝试将两者相关联 (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'

如有任何帮助,我们将不胜感激,感谢阅读。

最佳答案

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

因为我试图将用户添加到报价列表中,所以我需要 1) 确保用户是传递给 UserOfferResponse 构造函数的第一个项目(因为这是 association_proxy 调用它的方式,或者2) 向 association_proxy 添加一个显式的“创建者”参数。

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

关于python - 尝试设置多对多关联对象时 backref 上的关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361935/

相关文章:

python - Flask发送html数据回 View

python - RoboBrowser 表单提交

python - Python 中的闭包和循环

postgresql - 从选择查询中删除重复项

python - Flask - 不允许的方法

python - Flask 上的 RESTful API。如何将目录上传到服务器

Python Pandas 比较 2 个大型文本数据帧的相似性

Python 线性搜索效率更高

python - 可以从 SQLAlchemy 模型的列中提取相关序列名称吗?

sql - Go 没有参数 $1