确保所有基于字段的列表项有效地存在于 table 中

Make sure all list items based on fields exists in table efficiently

我有这样一个模型:

class MyModel(models.Mode):
    foo = models.CharField(...)
    bar = models.CharField(...)

我有一个包含 foo 和 bar 字段值的列表。我想检查此列表中的所有项目,是否存在于数据库中。 例如:

my_list = [{'foo': 'foo_1','bar': 'bar_1'}, {'foo': 'foo_2','bar': 'bar_2'}]

我想检查数据库中列表项字段对应的所有记录是否存在值。我可以更改我的列表结构。

我可以用 for 循环来做,但我想找到更有效的方法。单个查询可能吗?有什么建议吗?

您可以尝试检查 SQL 响应中的实例数:

from django.db.models import Q

my_list = [{'foo': 'foo_1','bar': 'bar_1'}, {'foo': 'foo_2','bar': 'bar_2'}]
query = Q()
for i in my_list:
    query &= Q(foo=i['foo'], bar=i['bar'])
queryset = MyModel.objects.filter(query)

assert queryset.count() == len(my_list)  # 2 == 2

因此,如果您的数据库中有所有值,则 count 和 len 值将相同。

如果您的 my_list 仅包含适当的字段,您可以这样做:

for i in my_list:
    query &= Q(**i)