2017-12-18 262 views
2

我想比較django的Q objects,它們以完全相同的方式組成。Django的Q對象的平等

儘管所有的孩子和他們之間的關係是相同的,他們並不相同。

from django.db.models import Q 

$ q1 = Q(a=1) & Q(b=1) & Q(c=1) 

$ q2 = Q(a=1) & Q(b=1) & Q(c=1) 

$ q1 == q2 

$ False 

這是我的單元測試中構建問題的地方,我使用Q對象爲我的查詢集構建了過濾器。

爲什麼兩個Q對象不相等?

我正在使用Django 1.11。

回答

3

Django < = 1.11.x沒有爲Q對象實現__eq__方法。 可以看出here

Django> = 2.0爲Q對象實現__eq__方法。 Code

因此,在Django 2.0之前不可能直接檢查兩個Q對象的相等性。

但是可以編寫一個簡單的函數來檢查Q對象的相等性。我們可以直接使用回購代碼。

def compare_q(q1 , q2): 
     return (
      q1.__class__ == q2.__class__ and 
      (q1.connector, q1.negated) == (q2.connector, q2.negated) and 
      q1.children == q2.children 
     ) 

所以,對於老版本的Django的,我們可以這樣做:

$ compare_q(q1 , q2) 

$ True