检查列表中的每个值是否存在于单个查询中的给定 Django 模型 Table 中
Check if each value within list is present in the given Django Model Table in a SINGLE query
假设我想实现这个通用函数:
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()
而不是 [=16] =] 或 .exists()
MYSQL 连接断开。
有没有人有更优雅的方法来解决这个问题?
如果您知道要传递 N
个 pks,那么按这些 pks 过滤的 count()
查询应该正好有 N
个结果。
def do_exist(model, pks):
return model.objects.filter(pk__in=pks).count() == len(pks)
qs = MyModel.objects.filter(id__in=pks)
这为您提供了一个查询集,您可以将 .all() 等应用于
在 Django 中,您可以将 id__in 查询与查询集结合使用,以根据 ID 列表过滤查询集。
results = Model.objects.filter(id__in = pks)
res = MyModel.objects.filter(id__in=pks)
假设我想实现这个通用函数:
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()
而不是 [=16] =] 或 .exists()
MYSQL 连接断开。
有没有人有更优雅的方法来解决这个问题?
如果您知道要传递 N
个 pks,那么按这些 pks 过滤的 count()
查询应该正好有 N
个结果。
def do_exist(model, pks):
return model.objects.filter(pk__in=pks).count() == len(pks)
qs = MyModel.objects.filter(id__in=pks)
这为您提供了一个查询集,您可以将 .all() 等应用于
在 Django 中,您可以将 id__in 查询与查询集结合使用,以根据 ID 列表过滤查询集。
results = Model.objects.filter(id__in = pks)
res = MyModel.objects.filter(id__in=pks)