如何检查Django queryset中是否存在一个元素?

eimct9ow  于 2022-11-26  发布在  Go
关注(0)|答案(5)|浏览(135)

是不是跟普通的Python皮套装一样?
假设我有以下queryset

entry_set = Entry.objects.all()

如何检查Entry_set中是否存在Entry对象e?

xxslljrj

xxslljrj1#

您可以使用下列程式码:

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

还是最好的办法:

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

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
查询集示例:

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的性能都会受到很大影响。我已经看到过一些案例,通过避免这种做法,我们在一个应用程序中提高了几十秒。

xa9qqrwz

xa9qqrwz3#

可以使用in运算符:

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

lsmepo6l4#

在Django〉= 4.0中,contains(obj)比其他方法更快。

if some_queryset.contains(obj):
    print('Object entry is in queryset')

这将比以下需要评估和迭代整个查询集的方法更快:

if obj in some_queryset:
    print('Object entry is in queryset')
4bbkushb

4bbkushb5#

你可以根据Entry模型中的唯一键来过滤查询集,比如说,这个键是id,你的代码将变成:

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

相关问题