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 来证明Entrypk=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() 来检查Entrypk=123 是否是这个查询集的成员。在这种特定情况下(使用pub_date__year=2010),我们检查Entry 是否属于2010 年发布的Entrys。

【讨论】:

所以在这个例子中是 some_queryset = entry 即 if entry.filter(pk=entry.pk).exists(): @DCR: some_queryset 不能是entryEntryEntry 对象,而不是 Entrys 的 QuerySetsome_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()的主要内容,如果未能解决你的问题,请参考以下文章

django如何实现存在性检查

使用 annotate Exists 时提高 Django 查询集性能

如何在django中添加列表值?

django+SQLite搭建轻量级个人博客QuerySet的exists()方法检查是否有数据

如何只运行一次 Django 后台任务

如何在 Knex 上使用 EXISTS 进行子查询?