【发布时间】:2022-01-13 21:12:53
【问题描述】:
假设我想实现这个通用函数:
def do_exist(key:str, values:list[any], model: django.db.models.Model) -> bool
在 SINGLE 查询中检查所有给定值是否存在于给定模型的名为 key 的列中。
我已经实现了这样的东西
from django.db.models import Exists
def do_exist(key, values, model):
chained_exists = (Exists(model.objects.filter(F(key)=value)) for value in values)
qs = model.objects.filter(*chained_exists).values("pk")[:1]
# Limit and values used for the sake of less payload
return len(qs) > 0
它会生成一个非常有效的 SQL 查询,但让我害怕的是,如果我尝试将评估方法调用附加到 qs,比如 .first() 而不是 [:1] 或 .exists(),MYSQL 连接就会断开。
有没有人有更优雅的方法来解决这个问题?
【问题讨论】:
-
我不是 100% 确定我是否理解您的问题,但是如果您想在 Django 中进行过滤,您可以使用带有查询集的 id__in 查询来根据 ID 列表过滤查询集。
标签: python mysql django django-models