[django][ORM] OR 연산

Hyeseong·2020년 12월 25일
0

django

목록 보기
18/35

안녕하세요. ORM연습을 위한 self 블로그 포스팅을 해보겠습니다.

전제조건

  • django project를 하나 만드세요.
  • from django.contrib.auth.models import User 테이블을 이용할거에요.
  • sqlite3를 이용할거에요.(설치 및 사용법에 대해 쪼오끔 숙지필요)

시작하기

시작해보조~

1. data 밑밥작업

아래와 같이 밑밥 작업을 위해 해당 계정을 add user 버튼 눌러서 일일이 노가다 해주세요.

2. db와 shell에서 table에 있는 data 확인하기

눈 크게 뜨고 봐야 잘 안보이니 확대해서 봐주시면 되요. 고럼 CLI 명령어가 보입니당~.
db에서는 전체 컬럼을 보여줘서 지저분하조?

shell에서는 클래스명과 객체이름이 반환되서 리스트에 담겨 짧게 전달되니 가독서잉 좋네요.

sqlite3
> select * from auth_user;

python shell
> from django.contrib.auth.models import User
> User.objects.all()

3. 구조화된 질문 언어?!

*SQL query

SQL을 본격적으로 사용해보조.
first_name이 R로 시작하거나~! last_name이 D로 시작하는 데이따를 보고싶다면?

select username, first_name, last_name, email from auth_user where first_name like 'R%' or last_name like 'D%';

.mode column 명령어 넣으니 오와 열이 딱딱!맞고 컬럼명도 나와서 좋네요 ㅋㅋㅋㅋ
중요한건 의도한대로 or조건으로 잘 나왔다는 사실~

ORM queryset
django queryset은 아래와 같이 만들면 리스트에 담겨서 객체들이 하나하나 나오는거 보이조?

잠깐만~!

혹시 이 queryset이 과연 SQL로는 어떻게 만들어 지는지 궁금하지 않나요?
장고 ORM이 만들어 주는 sql쿼리문 보실까예?

>>> str(queryset.query)
'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE ("auth_user"."first_name" LIKE R% ESCAPE \'\\\' OR "auth_user"."last_name" LIKE D% ESCAPE \'\\\')'

참 유도리 없이 만든 SQL이네요.

여기까지 오면서 느낀점은 아~~~ 왜이리 길어! 입니다.
이를 해결해 주는 역할이 있으니 Q()객체입니다!

Q 객체

Q객체로 말할것 같으면 위에 있는 길게~~~ 쓰는 원시적이고 구닥다리 같은 방식 말고 brand new하게 짧지만 impact 있는 방식으로 ORM을 구성하는 방식이에요.

백문이 불여일타~!

# 방법1 
qs = User.objects.filter(Q(first_name__startswith='R')|Q(last_name__startswith='D'))

# 방법2  lookup filed를 사용하지 않고
qs = User.objects.filter(Q(first_name='R')|Q(last_name__startswith='D'))

1번은 Q객체 안쓴거
2번은 Q객체 쓴거

참고로 1번 2번에서 django orm이 생성하는 SQL은 동일해요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글