django如何使用exists()
Posted
技术标签:
【中文标题】django如何使用exists()【英文标题】:django how to use exists() 【发布时间】:2020-11-17 21:37:43 【问题描述】:django 文档有以下内容:
entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
print("Entry contained in queryset")
有人能解释一下这是如何工作的吗?必须执行第一行吗?我们可以这样做吗:
if some_queryset.filter(pk=123).exists():
print("Entry contained in queryset")
我对 some_queryset 是什么感到困惑。在上面的例子中不会:
entry = Entry.objects.get(pk=123)
if entry.filter(pk=entry.pk).exists():
print("Entry contained in queryset")
更有意义?
【问题讨论】:
【参考方案1】:我们可以这样做吗:
if some_queryset.filter(pk=123).exists(): print("Entry contained in queryset")
是的。 Django 文档仅使用示例首先获取Entry
来证明Entry
和pk=123
存在于Entry
记录中。如果您想检查它是否也存在于some_queryset
(例如.filter(…)
ed 版本的Entry.objects.all()
)中,您可以使用.filter(pk=entry.pk)
。
但是你确实不需要首先需要获取Entry
对象,如果你事先知道主键,你已经可以直接使用它了。毕竟entry.pk
就是123
,对于.filter()
子句,该数据的来源并不重要。
我对 some_queryset 是什么感到困惑。
这个想法是他们在这里有一个some_queryset
,它是一个QuerySet
over Entry
对象。例如,这可以是一个Entry.objects.filter(pub_date__year=2010)
,因此是一个被过滤的查询集。如果你想知道entry
是否是这个过滤 查询集的成员,你可以使用some_queryset.filter(pk=123).exists()
来检查Entry
和pk=123
是否是这个查询集的成员。在这种特定情况下(使用pub_date__year=2010
),我们检查Entry
是否属于2010 年发布的Entry
s。
【讨论】:
所以在这个例子中是 some_queryset = entry 即 if entry.filter(pk=entry.pk).exists(): @DCR:some_queryset
不能是entry
。 Entry
是 Entry
对象,而不是 Entry
s 的 QuerySet
。 some_queryset
可以是例如Entry.objects.all()
或Entry.objects.filter(pub_date__year=2010)
。
我不明白。开始怀疑 django 是否值得花时间。 entry = Entry.objects.get(pk=123),entry 不是查询集吗?
@DCR: 不,.get(..)
将检索 single 记录,从而产生Entry
。如果你使用Entry.objects.filter(pk=123)
,那么你会得到一个QuerySet
(所以使用.filter(...)
),但是当然它没有.pk
,因为QuerySet
是一个(懒惰的)集合 对象。
你到底是如何在未声明或未定义的 some_queryset 上运行过滤器的?以上是关于django如何使用exists()的主要内容,如果未能解决你的问题,请参考以下文章
使用 annotate Exists 时提高 Django 查询集性能