如何检查Django查询集中是否存在元素?

时间:2015-08-14 04:18:59

标签: python django python-2.7 python-3.x django-models

它是否像常规的python集?

假设我有以下查询集

entry_set = Entry.objects.all()

如何检查entry_set中是否存在Entry Object e?

4 个答案:

答案 0 :(得分:11)

您可以使用以下代码:

if e in Entry.objects.all():
        #do something

或者最好的方法:

if Entry.objects.filter(id=e.id).exists():
        #do something

答案 1 :(得分:2)

根据Django文档,最佳方法:https://docs.djangoproject.com/en/2.1/ref/models/querysets/

if Entry.objects.filter(id=item.id).exists():
    # Do something

但是您也可以这样做:

if item in Entry.objects.all():
    # Do something

尽管这种方法尽可能地更糟。因为与另一种方法(几乎是在数据库级别完成的所有操作)相比,它会一个接一个地遍历整个Queryset从数据库中提取元素。

如果您具有ID列表或Queryset,则可以使用__in

带有查询集的示例:

query_ids = other_queryset.values_list('field_id', flat=True)
if Entry.objects.filter(id__in=query_ids).exists():
    # Do something

或者如果您有ID列表:

if Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists():
    # Do something

请记住,每次执行len(queryset)item in querysetlist(queryset)时,都会严重降低Django的性能。我已经看到了避免这种做法的情况,我们在一个应用程序中改进了数十秒。

答案 2 :(得分:0)

您可以使用in运算符:

entry_set = Entry.objects.all()
if an_entry in entry_set:
    # The element present.

答案 3 :(得分:0)

您可以根据Entry模型中的唯一键过滤查询集。比如,该密钥是id,您的代码将成为:

is_present = Entry.objects.filter(id=e.id)
if is_present:
    print "Present"
else:
    print "Not Present"