Search code examples
djangodjango-modelsdjango-filterdjango-q

Django filter OR - q objects performance vs I performance


What will have better performance? Which is faster? Which implies lower db load?

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

or

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

Solution

  • These should generate identical SQL. I don't have your model definition but using the auth.User model you can see it is the same:

    >>> 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