python赋值给Flask-SQLAlchemy中的AppenderBaseQuery属性没有效果

时间:2017-08-08 19:04:07

标签: python python-2.7 sqlalchemy flask-sqlalchemy

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

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

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

  

id {int} 1

     

标签{AppenderBaseQuery}(选择......)

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

user.tags=list()

但是这一行对对象没有任何影响,用户仍然包含AppenderBaseQuery。这个属性如何变得不可变。我不明白。对于python仍然是新手,如果这个问题很愚蠢,那就很抱歉。

编辑:

我不会改变数据库。我试图从会话中分离用户对象但没有成功。我已经有了标签列表,只想将其设置为用户对象标签列表。在我将它序列化为json并返回响应与用户列表之后。 Usualy我用url_for创建标签url,但这次我想用用户返回标签列表以使事情更快

1 个答案:

答案 0 :(得分:3)

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

  

由于动态关系的读取端始终查询数据库,因此在刷新数据之前,对底层集合的更改将不可见。但是,只要在正在使用的Session上启用“autoflush”,每次集合即将发出查询时都会自动执行此操作。

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

时会发生什么
user.tags = []
print user.tags.all()

Autoflush应该启动,更新所有原始相关的对象,在发出用于获取关系的SELECT之前使其外键(取决于级联)归零。