안녕하세요. ORM연습을 위한 self 블로그 포스팅을 해보겠습니다.
from django.contrib.auth.models import User
테이블을 이용할거에요.sqlite3
를 이용할거에요.(설치 및 사용법에 대해 쪼오끔 숙지필요)시작해보조~
아래와 같이 밑밥 작업을 위해 해당 계정을 add user 버튼 눌러서 일일이 노가다 해주세요.
눈 크게 뜨고 봐야 잘 안보이니 확대해서 봐주시면 되요. 고럼 CLI 명령어가 보입니당~.
db에서는 전체 컬럼을 보여줘서 지저분하조?
shell에서는 클래스명과 객체이름이 반환되서 리스트에 담겨 짧게 전달되니 가독서잉 좋네요.
sqlite3
> select * from auth_user;
python shell
> from django.contrib.auth.models import User
> User.objects.all()
*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객체로 말할것 같으면 위에 있는 길게~~~ 쓰는 원시적이고 구닥다리 같은 방식 말고 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은 동일해요.