检查列表中的每个值是否存在于单个查询中的给定 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)