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

Bri*_*ian 11 python django django-models python-2.7 python-3.x

它像常规的python集吗?

假设我有以下查询集

entry_set = Entry.objects.all()
Run Code Online (Sandbox Code Playgroud)

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

Sid*_*pta 19

您可以使用以下代码:

if e in Entry.objects.all():
        #do something
Run Code Online (Sandbox Code Playgroud)

或者最好的方法:

if Entry.objects.filter(id=e.id).exists():
        #do something
Run Code Online (Sandbox Code Playgroud)

  • @Brian,你可以做一些像`Entry.objects.filter(title ='你很棒的标题').exsent()` (3认同)

小智 6

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

if Entry.objects.filter(id=item.id).exists():
    # Do something
Run Code Online (Sandbox Code Playgroud)

但是您也可以这样做:

if item in Entry.objects.all():
    # Do something
Run Code Online (Sandbox Code Playgroud)

尽管这种方法越糟越好。因为与另一种方法(几乎是在数据库级别完成的所有方法)相比,它将逐个循环从数据库中提取整个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
Run Code Online (Sandbox Code Playgroud)

或者,如果您有ID列表:

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

请记住,每次你做len(queryset)item in queryset或者list(queryset)你大量法令的Django的性能。我已经看到了避免这种做法的情况,我们在一个应用程序中改进了数十秒。