【发布时间】:2015-11-07 05:54:24
【问题描述】:
它像普通的 python 集吗?
假设我有以下查询集
entry_set = Entry.objects.all()
如何检查entry_set中是否存在Entry Object e?
【问题讨论】:
标签: python django python-2.7 python-3.x django-models
它像普通的 python 集吗?
假设我有以下查询集
entry_set = Entry.objects.all()
如何检查entry_set中是否存在Entry Object e?
【问题讨论】:
标签: python django python-2.7 python-3.x django-models
您可以使用以下代码:
if e in Entry.objects.all():
#do something
或者最好的方法:
if Entry.objects.filter(id=e.id).exists():
#do something
【讨论】:
Entry.objects.filter(title='Your awesome title').exists()
根据 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 queryset 或list(queryset) 时,都会严重影响 Django 的性能。我已经看到一些案例,通过避免这种做法,我们在应用程序中改进了几十秒。
【讨论】:
Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists() 将返回 True 如果列表中至少有一个元素在查询集中
您可以使用in 运算符:
entry_set = Entry.objects.all()
if an_entry in entry_set:
# The element present.
【讨论】:
您可以根据 Entry 模型中存在的唯一键过滤查询集。比如说,那个键是 id,你的代码会变成:
is_present = Entry.objects.filter(id=e.id)
if is_present:
print "Present"
else:
print "Not Present"
【讨论】: