2017-12-18 6 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 개체가 같지 않은 이유는 무엇입니까?

장고 1.11을 사용하고 있습니다.

답변

3

장고 < = 1.11.x는 Q 개체에 대해 __eq__ 메서드를 구현하지 않습니다. 마찬가지로 볼 수 있듯이 here입니다.

Django> = 2.0은 Q 객체에 대해 __eq__ 메소드를 구현합니다. Code.

그래서 Django 2.0 이전에 두 개의 Q 객체가 같은지 직접 확인할 수는 없습니다.

그러나 Q 개체의 동일성을 검사하는 간단한 함수를 작성할 수 있습니다. 우리는 repo의 코드를 직접 사용할 수 있습니다.

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

그래서 장고의 이전 버전을 위해 우리가 할 수

$ compare_q(q1 , q2) 

$ True