Django,检查属性数组中的许多项是否存在

Django,检查属性数组中的许多项是否存在,django,Django,如果我想检查Django表是否有两个属性与上面对应的项,我可以执行以下操作: arr = [ {id: 1, filename: "a"}, {id: 2, filename: "b"}, ] 但这需要对数组中的每个项执行一次查询 如何在单个查询中完成此操作 我想把Qs链接成这样: for n in arr: e = MyTable.objects.filter(id=n["id"], filename=n["filename"]).exists() if not e: # r

如果我想检查Django表是否有两个属性与上面对应的项,我可以执行以下操作:

arr = [
{id: 1, filename: "a"},
{id: 2, filename: "b"},
]
但这需要对数组中的每个项执行一次查询

如何在单个查询中完成此操作

我想把
Q
s链接成这样:

for n in arr:
    e = MyTable.objects.filter(id=n["id"], filename=n["filename"]).exists()
    if not e: # raise error
但是,我如何检查每个单独的Q是否返回至少一个条目呢


我不关心arr上的循环,只要我不为每次迭代执行查询。

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

Q(id=n['id'],filename=n['filename']) | Q(id=n['id'],filename=n['filename']) | ...for each item in array
从functools导入reduce
从操作员导入或_
MyTable.objects.filter(
减少(或Q(id=n['id'],filename=n['filename']),用于arr中的n])

).count()==len(arr)
列出所有
ID
文件名
,然后在
中使用
\u


每个
{…}
都有一个不同的
id
?是的:我们可以假设,只有在不可能有{id:1,filename:“b”}项的情况下,这才有效。但这比威廉·范·昂森的回答要快(我猜)。@IgorBekov:我认为如果
文件名
s可以不同地分布,例如,两个项目的文件名可以交换,这会起作用。考虑到这一约束,它是有效的,否则,它可能会失败。因此,我建议Gaurav在答案中添加一个注释,在这些假设下,这是一个有效的答案。
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)
ids = [item.get('id') for item in arr]
filenames = [item.get('filename') for item in arr]
qs = MyTable.objects.filter(id__in=ids, filename__in=filenames)
assert qs.count() == len(arr)