2014-06-11 80 views
3

什麼會有更好的性能?哪個更快?這意味着更低的數據庫負載?Django過濾器OR-q對象性能vs I性能

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

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

最有可能第一個,因爲這將是一個查詢而不是兩個。 [django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar)是一個很好的工具,可以確定哪個更快。 – Matt

+1

第一個 - 它是一個帶連接的單個查詢,而第二個是連接的兩個查詢。另外,如果您切片,第二種情況將不起作用。 – karthikr

+3

你比較了它們生成的SQL嗎? Django應該將其作爲單個查詢來處理,我希望它們是相同的。 –

回答

9

這些應該生成相同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