Django 过滤器 OR - q 对象性能与 I 性能

Posted

技术标签:

【中文标题】Django 过滤器 OR - q 对象性能与 I 性能【英文标题】:Django filter OR - q objects performance vs I performance 【发布时间】:2014-08-01 16:34:56 【问题描述】:

什么会有更好的表现?哪个更快?这意味着较低的数据库负载?

Item.objects.filter(Q(creator=owner) | Q(moderated=False))

result = Item.objects.filter(item.creator = owner) | Item.objects.filter(item.moderated = False)

【问题讨论】:

很可能是第一个,因为它将是一个查询而不是两个。 django-debug-toolbar 是一个很好的工具,可以确定哪个更快。 第一个 - 它是带有连接的单个查询,而第二个是链接的 2 个查询。此外,如果切片,第二种情况将不起作用。 你比较过它们生成的 SQL 吗? Django 应该将其作为单个查询处理,我希望它们是相同的。 【参考方案1】:

这些应该生成相同的 SQL。我没有你的模型定义,但是使用auth.User 模型你可以看到它是一样的:

>>> from django.contrib.auth.models import User
>>> from django.db.models import Q
>>> q1 = User.objects.filter(Q(is_staff=True) | Q(is_superuser=True))
>>> print(q1.query)
SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE ("auth_user"."is_staff" = True OR "auth_user"."is_superuser" = True)
>>> q2 = User.objects.filter(is_staff=True) | User.objects.filter(is_superuser=True)
>>> print(q2.query)
SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE ("auth_user"."is_staff" = True OR "auth_user"."is_superuser" = True)
>>> str(q1.query) == str(q2.query)
True

【讨论】:

以上是关于Django 过滤器 OR - q 对象性能与 I 性能的主要内容,如果未能解决你的问题,请参考以下文章

Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段

Django,按用户全名过滤 Q 对象

Django 中的 Q 对象

Django,在模型中按函数过滤 Q 对象

Django 查询:返回一个将转换为“AND (...)”的 Q 对象

Django Q 对象不工作