django - 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 。
解决方案
根据您的评论,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)
推荐阅读
- apache - 使用 WHM 和 apache2 将子域转发到 localhost 的端口
- python - 在 python 中,如何在具有 dtype 对象的列上使用 split('_')?
- c++ - 如何使地图按值排序C++
- flutter - 使用 Package flutter_webview_plugin 获取旧的滚动偏移量
- postgresql - 列索引超出范围:2,列数:1 更新 jsonb 列时出错
- c# - 在等待异步完成之前函数返回
- python - 将 ID 与一组不同的名称匹配
- reactjs - 在网格中定位元素的更好方法
- appium-android - 在可点击元素上启动时,Appium 无法在 Android App 中滚动
- manim - 如何获取已经确定的图表上某个点的坐标?