【问题标题】:Django model filter on list of dictionaries字典列表上的 Django 模型过滤器
【发布时间】:2014-09-19 14:14:32
【问题描述】:

我想根据两个值过滤一个表。其中是第一个的最高现有版本。首先,我从第一个模型中得到这两个值。

latest_versions = Version.objects.values('post').annotate(version=Max('version'))

这给了我一个字典列表,其中包含帖子名称及其最新版本。

[{name: xxx, version: 1.2}{name: yyy, version: 3.4}]

现在我想使用这个字典列表 (latest_versions) 作为另一个表的过滤器,该表具有名为 nameversion 的列。

我认为这可能有效:

Post.objects.filter(**latest_versions)

但它没有,因为它是一个 ValueQuerySet,一个字典列表。但是,如果我遍历 ValueQuerySet 它可以工作,但我必须为每个实例进行数据库调用。

for latest_version in latestversions:
    r = Post.objects.filter(**latest_version)
    result = result + list(r)

Pythonic 的方法是什么?

提前致谢。

【问题讨论】:

    标签: django list dictionary django-models filter


    【解决方案1】:

    您可能正在寻找 Q 对象:

    from django.db.models import Q
    ...
    filter_list = Q()
    for item in latest_versions:
        filter_list |= Q(item)
    Post.objects.filter(filter_list)
    

    filter_list 将是由“或”分隔的 Q 对象列表

    https://docs.djangoproject.com/en/1.6/topics/db/queries/#complex-lookups-with-q-objects

    【讨论】:

    • 如果我将列表新建为只有 2 个条目长,这将起作用。当这个字典列表的长度未知时怎么办?
    • 更新了答案。它与您最初拥有的类似,但不是过滤每次都会调用数据库的每个对象,而是遍历您的“最新版本”列表并将 Q 对象链接起来,用“或”分隔它们。
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2021-11-24
    • 2020-08-02
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多