Q object 이용해 조건에 맞는 데이터 불러오기

Jay·2020년 4월 5일
1

Q 객체를 사용하면 and, or, not 연산을 이용한 조건을 걸어서 데이터를 가져올 수 있다.

from django.db.models import Q           		[1]
from django.forms.models import model_to_dict	        [2]

#1  or 
obj = User.objects.filter(Q(name_kr__startswith = '김') | Q(account_number__endswith = '7'))   [3]
model_to_dict(obj[0])                			[4]

#2 and
obj2 = User.objects.filter(Q(birth = '1505-03-13') & Q(gender = 1)) [5]
model_to_dict(obj2[0])					[6]

#3 not
obj3 = User.objects.filter(Q(birth__startswith = '1999') & ~Q(name_eng = 'kukudas')) [7]
model_to_dict(obj3[0]) 					[8]

[1] 데이터에 조건을 걸기 위해 Q 모듈을 import 한다
[2] 객체를 딕셔너리 형식으로 변환해 출력해주는 모듈을 import 한다
[3] user 테이블에서 name_kr이 '김'으로 시작하거나 account_number가 7로 끝나는 데이터들을 obj라는 객체에 담았다.
[4] obj에서 0번째에 있는 객체를 딕셔너리 형식으로 출력해줘서 결과를 보기 편하다.
결과 :

{'id': 1, 
'grade': 1, 
'account_number': '10147747', 
'account': 'aaa1234', 
'name_kr': '에이',
 중간 생략}

[5] user테이블에서 생일이 1505년 3월 13일 이고 gender id가 1인 데이터를 소환하기 위한 조건을 걸었다.
[6] 결과 :

{'id': 11, 
'grade': 1, 
'account_number': '10147757', 
'birth': datetime.date(1505, 3, 13), 
'gender': 1, 
 중간 생략 }

[7] 출생년도가 1999년이면서 영어이름이 kukudas가 아니어야 한다는 조건을 걸었다. not은 ~ 라고 표시하면 된다.
[8] 결과 :

{'id': 1, 
'grade': 1, 
'account_number': '10147747', 
'account': 'aaa1234',
'name_kr': '에이', 
'name_eng': 'a', 
'birth': datetime.date(1999, 1, 1)
 중간 생략 }

이와 비슷하게 exclude 라는 것도 사용할 수 있다.

Point.objects.filter(user = 33).exclude(saved_point = 313)

filter처럼 사용할 수 있는데, 위 코드는 포인트 테이블에서 user_id가 33인 데이터 중에서 saved_point가 313인 데이터는 제외한 나머지 데이터를 출력한다.

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

0개의 댓글