【问题标题】:python assignment to AppenderBaseQuery property in Flask-SQLAlchemy without effectpython分配给Flask-SQLAlchemy中的AppenderBaseQuery属性没有效果
【发布时间】:2018-01-16 11:43:43
【问题描述】:

我有查询从数据库中选择用户列表。每个用户对象都有标签列表。这是使用这种关系在 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 并返回带有用户列表的响应之后。通常我用 url_for 创建标签 url,但这次我想用用户返回标签列表以使事情更快

【问题讨论】:

    标签: python python-2.7 sqlalchemy flask-sqlalchemy


    【解决方案1】:

    它不是一成不变的,但它有点特殊。您已经使用lazy='dynamic' 配置了您的关系及其反向引用。这使得你有一个Query 对象来代替检测的集合——这对于处理大量相关对象的集合很方便。这个查询对象除了查询的基本filter()all()等,如append()remove()之外,还增加了一些方法和特性,并且支持赋值,但基本上是查询的快捷方式相关对象。进一步阅读我们发现的文档:

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

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

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

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

    【讨论】:

    • 我不会更改数据库。我试图从会话中分离用户对象但没有成功。我已经有了标签列表,只想将其设置为用户对象标签列表。在我将其序列化为 json 并返回带有用户列表的响应之后。通常我用 url_for 创建标签 url,但这次我想用用户返回标签列表以使事情更快
    • 在这种情况下,我建议在序列化期间设置标签。正如您所注意到的,appender 查询属性用于处理关系,即位于数据库中的数据。如果我理解正确,您有一组单独的标签属于用户,所以在我看来,最好的选择是在序列化期间合并它们,而不是先尝试将它们设置在用户对象上。但这只是一种意见。
    • 你也应该在你的问题中包含它。现在它有点像XY problem:你问的是别的东西,而不是问你真正想要做什么,在这种情况下,为 DB 对象的序列化添加额外的数据。
    • 是的。谢谢您的回答。我将使用这种方法。我接受了你的回答。真正有用的是你的评论。问候
    猜你喜欢
    • 2020-01-10
    • 2013-10-12
    • 2018-12-23
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2020-07-08
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多