python 对 Flask-SQLAlchemy 中 AppenderBaseQuery 属性的赋值无效

标签 python python-2.7 sqlalchemy flask-sqlalchemy

我有一个查询,从数据库中选择用户列表。每个用户对象都有标签列表。这是使用以下关系在标签模型中设置的:

users = db.relationship('User', secondary=user_tag, backref=db.backref('tags', lazy='dynamic'), lazy='dynamic')

当返回查询结果时,我有用户对象:

id {int}1

tags {AppenderBaseQuery}(Select ...)

一切都好,但我想将新列表分配给标签属性

user.tags=list()

但是这一行对对象没有任何影响,并且用户仍然包含 AppenderBaseQuery。该属性如何变得不可变。我不明白。对 python 还很陌生,如果问题很愚蠢,抱歉。

编辑:

我不习惯更改数据库。我尝试将用户对象与 session 分离,但没有成功。我已经有了标签列表,只想将其设置为用户对象标签列表。在我将其序列化为 json 并返回带有用户列表的响应之后。通常我使用 url_for 创建标签 url,但这次我想返回用户的标签列表,以使事情更快

最佳答案

它不是一成不变的,但它有点特殊。您已使用 lazy='dynamic' 配置了您的关系及其 backref 。这使得您可以使用 Query 对象来代替已检测的集合 - 可以方便地处理大量相关对象的集合。除了查询的基本 filter()all() 等之外,该查询对象还添加了一些附加方法和功能,例如 append() remove() 以及对赋值的支持,但基本上它是查询相关对象的快捷方式。进一步阅读文档我们发现:

Since the read side of the dynamic relationship always queries the database, changes to the underlying collection will not be visible until the data has been flushed. However, as long as “autoflush” is enabled on the Session in use, this will occur automatically each time the collection is about to emit a query.

如果您已将引擎配置为回显它发送的 SQL,您应该观察执行时会发生什么

user.tags = []
print user.tags.all()

自动刷新应该启动,更新所有最初相关的对象,在发出用于获取关系的 SELECT 之前清空它们的外键(取决于级联)。

关于python 对 Flask-SQLAlchemy 中 AppenderBaseQuery 属性的赋值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45576199/

相关文章:

python - 用openai图表txt文件编码到midi转换器

python - 在Python中不使用list、iter从字典中检索第一个键值对

python - 无法在 Python SOAP 调用中传递身份验证参数

python - 使用python从浏览器获取当前URL

python - 通过不区分大小写的列表进行 SQLAlchemy 查询

python - 如何将 jax vmap 用于嵌套循环?

python - 运行 Flask 应用程序时出现 404 Not Found

python - 序列化 Python 类

python - 灵药反射

python - SQLAlchemy 在 PostgresQL 中创建 View