首页 > 解决方案 > Django,检查是否存在,但在属性数组中的许多项目上

问题描述

arr = [
{id: 1, filename: "a"},
{id: 2, filename: "b"},
]

如果我想检查一个 Django 表是否有 2 个具有与上述属性对应的项目,我可以这样做:

for n in arr:
    e = MyTable.objects.filter(id=n["id"], filename=n["filename"]).exists()
    if not e: # raise error

但这需要对数组中的每一项进行一次查询。

如何在单个查询中执行此操作?

我在想这样链Q

Q(id=n['id'],filename=n['filename']) | Q(id=n['id'],filename=n['filename']) | ...for each item in array

但是,我如何检查每个单独的 Q 是否返回至少一个条目?

只要我不对每次迭代进行查询,我就不会关心遍历 arr 。

标签: django

解决方案


根据您的评论,arr所有项目都有一个distinct id,因此我们可以计算满足此条件的项目数。我们知道这应该与 中的字典数量相同arr,因为每个Q(id=..., ...)最多可以满足一个记录:

from functools import reduce
from operator import or_

MyTable.objects.filter(
    reduce(or_, [Q(id=n['id'],filename=n['filename']) for n in arr])
).count() == len(arr)

推荐阅读