首页 > 解决方案 > 根据字段上的条件过滤 django 查询集?

问题描述

我有一个这样的模型:

class Story(models.Model):
    version = models.PositiveIntegerField(default=1)
    # other fields

现在我得到一个id: version类似的字典:

id_ver_dict = {
  # id ver 
    23: 2,
    24: 1,
    25: 3
}

我想根据给定的 dict 过滤我的查询集,以使我的数据库中的版本大于id_ver_dict.

如何在单个查询中过滤它?有没有这样的东西:

Story.objects.filter(id__in=id_ver_dict.keys(), version__gt=id_ver_dict_value)

PS:我正在使用 MySQL

标签: django

解决方案


基本上你想对多个 ANDed 查询执行 OR。您需要使用Q 对象来执行此操作。您可以编写一个列表推导并使用它functools.reduce来轻松地做到这一点:

import functools
import operator

id_ver_dict = {
  # id ver 
    23: 2,
    24: 1,
    25: 3
}
queryset = Story.objects.filter(functools.reduce(operator.or_, [Q(id=obj_id) & Q(version__gt=ver) for obj_id, ver in id_ver_dict.items()]))

推荐阅读