当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Python Django Exists用法及代码示例

本文介绍 django.db.models.Exists 的用法。

声明

class Exists(queryset)

Exists 是使用 SQL EXISTS 语句的 Subquery 子类。在许多情况下,它会比子查询执行得更好,因为数据库能够在找到第一个匹配行时停止对子查询的评估。

例如,要注释每个帖子是否有来自最后一天的评论:

>>> from django.db.models import Exists, OuterRef
>>> from datetime import timedelta
>>> from django.utils import timezone
>>> one_day_ago = timezone.now() - timedelta(days=1)
>>> recent_comments = Comment.objects.filter(
...     post=OuterRef('pk'),
...     created_at__gte=one_day_ago,
... )
>>> Post.objects.annotate(recent_comment=Exists(recent_comments))

在 PostgreSQL 上,SQL 看起来像:

SELECT "post"."id", "post"."published_at", EXISTS(
    SELECT (1) as "a"
    FROM "comment" U0
    WHERE (
        U0."created_at" >= YYYY-MM-DD HH:MM:SS AND
        U0."post_id" = "post"."id"
    )
    LIMIT 1
) AS "recent_comment" FROM "post"

没有必要强制 Exists 引用单个列,因为这些列被丢弃并返回布尔结果。同样,由于排序在 SQL EXISTS 子查询中并不重要,并且只会降低性能,因此会自动将其删除。

您可以使用 NOT EXISTS~Exists() 进行查询。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.Exists。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。