Django | Q 객체

김민호·2021년 11월 12일
0

DJANGO

목록 보기
18/18

ORM을 찍어보기 위해 현재 진행하던 프로젝트 데이터를 활용했다
데이터베이스는 sqlite3 를 사용했고 Q 객체 를 사용하기 위해서는 먼저 from django.db.models import Q 를 해준다

Q객체와 SQL 쿼리문

  • 먼저 id=4인 데이터를 가져오는 sql쿼리문은 다음과 같다
# SQL 쿼리문

sqlite> select * from Banks where id=4;
4|카카오뱅크

  • id=4인 데이터를 가져오는 장고의 기본 ORM은 다음과 같다
    (filter() 메소드 사용)
# Django ORM

In [21]: Bank.objects.filter(id=4)

Out[21]: 2021-11-12 13:21:25,726 DEBUG (0.000)
SELECT "banks"."id", 
       "banks"."name" 
FROM "banks" 
WHERE "banks"."id" = 4 
LIMIT 21; 
args=(4,)
<QuerySet [<Bank: Bank object (4)>]>

  • Q객체를 써도 값은 똑같다
# Django ORM Q객체

In [22]: Bank.objects.filter(Q(id=4))
Out[22]: 2021-11-12 13:25:31,596 DEBUG (0.000)
SELECT "banks"."id", 
       "banks"."name" 
FROM "banks" 
WHERE "banks"."id" = 4 
LIMIT 21; 
args=(4,)
<QuerySet [<Bank: Bank object (4)>]>

다음 두 문장은 같은 데이터를 뽑아온다

# SQL 쿼리문
select * from Banks where id=4;

# Django ORM Q객체
Bank.objects.filter(Q(id=4))

&(and) 와 |(or)

SQL 쿼리문Django ORM
교집합(and)where 조건 and 조건&
합집합(or)where 조건 or 조건|
# Django ORM Q객체 &(and) 

In [23]: Bank.objects.filter(Q(id=2) | Q(id=4))

Out[23]: 2021-11-12 13:40:16,393 DEBUG (0.007)
SELECT "banks"."id", 
       "banks"."name" 
FROM "banks" 
WHERE ("banks"."id" = 2 OR "banks"."id" = 4) 
LIMIT 21; 
args=(2, 4)
<QuerySet [<Bank: Bank object (2)>, <Bank: Bank object (4)>]>
  • 장고의 filter 메소드는 쿼리셋을 반환하기 때문에 다음과 같이 조건에 충족하지 않는다면 빈 쿼리셋을 반환한다
# Django ORM Q객체 |(or)

In [26]: Bank.objects.filter(Q(id=2) & Q(id=4))

Out[26]: 2021-11-12 13:42:26,443 DEBUG (0.001)
SELECT "banks"."id", 
       "banks"."name" 
FROM "banks" 
WHERE ("banks"."id" = 2 AND "banks"."id" = 4) LIMIT 21; 
args=(2, 4)
<QuerySet []>

&= , |= ✍🏼

add(Q(), .AND) ✍🏼

profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글