是不是跟普通的Python皮套装一样?假设我有以下queryset
entry_set = Entry.objects.all()
如何检查Entry_set中是否存在Entry对象e?
xxslljrj1#
您可以使用下列程式码:
if e in Entry.objects.all(): #do something
还是最好的办法:
if Entry.objects.filter(id=e.id).exists(): #do something
iq0todco2#
根据Django的文档,最好的方法是:https://docs.djangoproject.com/en/2.1/ref/models/querysets/#exists
if Entry.objects.filter(id=item.id).exists(): # Do something
但你也可以这样做:
if item in Entry.objects.all(): # Do something
尽管这种方法是最糟糕的,因为它将在整个Queryset上循环,从数据库中一个接一个地提取元素,而另一种方法几乎所有的事情都在数据库级别上完成。如果您有一个id列表或一个Queryset,则可以使用其他方法__in查询集示例:
__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 queryset或list(queryset)时,Django的性能都会受到很大影响。我已经看到过一些案例,通过避免这种做法,我们在一个应用程序中提高了几十秒。
len(queryset)
item in queryset
list(queryset)
xa9qqrwz3#
可以使用in运算符:
in
entry_set = Entry.objects.all() if an_entry in entry_set: # The element present.
lsmepo6l4#
在Django〉= 4.0中,contains(obj)比其他方法更快。
contains(obj)
if some_queryset.contains(obj): print('Object entry is in queryset')
这将比以下需要评估和迭代整个查询集的方法更快:
if obj in some_queryset: print('Object entry is in queryset')
4bbkushb5#
你可以根据Entry模型中的唯一键来过滤查询集,比如说,这个键是id,你的代码将变成:
is_present = Entry.objects.filter(id=e.id) if is_present: print "Present" else: print "Not Present"
5条答案
按热度按时间xxslljrj1#
您可以使用下列程式码:
还是最好的办法:
iq0todco2#
根据Django的文档,最好的方法是:https://docs.djangoproject.com/en/2.1/ref/models/querysets/#exists
但你也可以这样做:
尽管这种方法是最糟糕的,因为它将在整个Queryset上循环,从数据库中一个接一个地提取元素,而另一种方法几乎所有的事情都在数据库级别上完成。
如果您有一个id列表或一个Queryset,则可以使用其他方法
__in
查询集示例:
或者,如果您有ID列表:
请记住,每次执行
len(queryset)
,item in queryset
或list(queryset)
时,Django的性能都会受到很大影响。我已经看到过一些案例,通过避免这种做法,我们在一个应用程序中提高了几十秒。xa9qqrwz3#
可以使用
in
运算符:lsmepo6l4#
在Django〉= 4.0中,
contains(obj)
比其他方法更快。这将比以下需要评估和迭代整个查询集的方法更快:
4bbkushb5#
你可以根据Entry模型中的唯一键来过滤查询集,比如说,这个键是id,你的代码将变成: