2017-08-08 248 views
0

我有查询选择数据库中的用户列表。每个用户对象都有标签列表。在Flask-SQLAlchemy中对AppenderBaseQuery属性的python赋值无效

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

当从查询结果返回我的用户对象:

ID {INT} 1

标签{AppenderBaseQuery}这是在Tag模型中使用这种关系设置(选择...)

都好,但我希望新的列表分配给tags属性

user.tags=list() 

但此行对对象没有任何影响,并且用户仍包含AppenderBaseQuery。这个属性如何变得不可变。我不明白。对于Python来说还是新的,如果问题很蠢,对不起。

编辑:

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

回答

2

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

由于动态关系的读取侧总是查询数据库,因此直到数据刷新为止,底层集合的更改才会显示。但是,只要在使用中的Session上启用了“自动刷新”,每次收集即将发出查询时都会自动发生。

如果你已经配置了你的发动机呼应它发出的SQL,你应该观察,当你做

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

自动冲洗应踢,更新所有原先相关的对象,归零外国发生了什么键(取决于级联),然后发出用于获取关系的SELECT。

+0

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

+1

在这种情况下,我建议在序列化期间设置标记。正如您已经注意到appender query属性用于处理关系,即位于数据库中的数据。如果我正确地理解了你,你有一组属于用户的标签,所以在我看来,你最好的选择是在序列化过程中将它们合并,而不是先尝试将它们设置在用户对象上。但这只是一个意见。 –

+1

另外你应该在你的问题中包括这个。因为它现在是一个[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):你问别的东西而不是问什么你真的想做,在这种情况下添加额外的数据到序列化的DB对象。 –