본문 바로가기
Django/Django Rest Framework

19. Django DRF orm 심화

by S.T.Lee 2022. 6. 20.

orm을 활용하여(다양한 데이터 검색 문법을 활용해) 원하는 값을 찾아낼 수 있다.

  • get, filter, exclude를 사용해 검색시 다양한 Field lookups 문법을 사용할 수 있다.
    • get : 매칭되는 데이터를 가져온다
    • filter : 조건에 맞는 데이터를 가져온다
    • exclude : 조건에 맞는 데이터를 제외하고 전부 가져온다
    • Field lookup은 무조건 under bar 2개를 작성해주고 해야된다.(__)
    • contains : 특정 string이 포함된 object 찾기
    • startwiths / endswith : 특정 string으로 시작하는 / 끝나는 object 찾기
    • gt / lt / gte / lte : 특정 값보다 크거나 / 작거나 / 크거나 같거나 / 작거나 같은 object 찾기
    • in : 특정 list에 포함된 object 찾기
#contains
UserModel.objects.filter(fullname__contains='이름')
#endswith
UserModel.objects.filter(fullname__endswith='호')
#in
UserProfileModel.objects.filter(hobby__name__in=['운동','독서'])
#나머지도 다 이런 방식으로 작성된다.

더 많은 내용은 하단의 공식 문서 참조(Field Lookup)

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#field-lookups

 

QuerySet API reference | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

  • orm과 kwargs 활용
    • kwargs를 활용해 여러 줄의 코드를 간소화 할 수 있다.
username = request.data.get("username", "")
email = request.data.get("email", "")
#원래 password는 set password로 따로 해줘야하지만 예시니깐
password = request.data.get("password", "")

UserModel.objects.create(username=username, email=email, password=password)

-------------
#이렇게 줄일 수 있다!
password = request.data.pop('password')
user = UserModel(**request.data)
user.set_password(password)
user.save()
#하지만 전에도 얘기했듯이 이렇게 하면 직관적으로 무엇이 들어오는지 알 수 없으므로 추천하지는 않는다
  • 검색 결과물 정렬하기
    • order_by : queryset을 정렬한다.
#가입순 정방향 정렬
User.objects.all.order_by('join_date')
#가입순 역방향 정렬
User.objects.all.order_by('-join_date')
#랜덤 셔플
User.objects.all.order_by('?')

 

 

 

__ 의 2가지 의미

1) 외래키 검색

class Something():
	user = models.ForeignKey(User)
    
class User():
	name = 
	email =

이럴때 filter(user__name='이름')으로 Something에서 User로 타고 들어가게 해준다.

 

2) orm

위의 내용들을 붙일 수 있다.

filter(user__contains='이름') filter(user__name__contains='이름') 모두 가능하다.