[django] ORM에서 or 연산을 해보자.

Posted by Start Bootstrap on November 09, 2017

django,orm,or,q-object


1. 왜.

  • django에서 orm을 사용하다 or 연산이 필요하게 되었다.


2. 그래서 무엇인가.

  • 기본 orm에서는 filter를 이용해 where절을 나타내곤한다.
  • filter(state=attend,user_id=1) 과 같이 and 연산은 ,(comma)로 이루어지지만, or 연산은 명시적으로 쉽게 쓸 방도가 보이지 않았다.
  • 문서를 보니 or 연산을 할 수 있는 Q object가 존재하였다.


3. 써보자.

import
  • q object를 통해 or 연산을 하려면 Q를 import하여야 한다.
from django.db.models import Q
  • 사실 Q 연산은 or 뿐아니라 굉장히 많은 기능들을 할 수 있다.(거의 모든 쿼리에 대한 것들을..)

  • 문서의 예제를 보자.

get(
Q(question__startswith='Who') | Q(question__startswith='What')
)
  • 위 와 같은 코드는 아래와 같다.
WHERE question LIKE 'Who%' OR question LIKE 'What%'
  • Q라는 함수에 파라미터를 넣어주게되는데 __startsWith 가 like 문이 되고 | 기호가 or연산이 된다.

  • 다른 예로는..

get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
  • 위 와 같은 코드는 아래와 같다.
WHERE question LIKE 'Who%'
    AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
  • 한 눈에 봐도 이해될정도로 간단하고 잘 만들어놓았다.



4.마치며

  • 사실 or를 어떻게 쓰지? 를 고민하다가 q object를 알게된것인데.. 실제 다양한 쿼리들을 쉽게 사용할 수 있다는 것을 깨달아서 너무 좋았다!


Ref.