TIL 24 | Django CRUD#2 GET Method

임종성·2021년 7월 20일
1

Django

목록 보기
6/17
post-thumbnail

Django CRUD #1을 통해 MVT Pattern의 Model을 작성하고 Database와 통신하는 법을 배웠다. CRUD #2 에서는 HTTP 통신을 이용해 Client - Server - Database의 data flow를 이해하고, Django Application을 통해 Request를 처리하기 위한 Logic(View)을 실행시켜 Database와 통신(Model)하고 데이터 작업을 수행하여 요청에 맞는 응답을 낼 수 있는 Backend API를 구현한다.

View Class 구현

POST Method에 붙여 GET Metohd에 대한 View Class를 작성해봤다. Owner와 Dog Table의 정보를 불러오는 것 뿐이므로 세션때 배운것처럼 만들어봤다.

class GetOwners(View):
    def get(self, request):
        owners = Owner.objects.all()		# owner QuerySet 불러오기
        results=[]
        for owner in owners:			# QuerySet의 Instance
            results.append(
                {
                    "name" : owner.name,	# Instance의 Filed들 
                    "email": owner.email,
                    "age"  : owner.age
                }
            )
        return JsonResponse({'resutls':results}, status=200)

class GetDogs(View):
    def get(self, request):	
        dogs = Dog.objects.all()		# dog QuerySet 불러오기
        results=[]
        for dog in dogs:			# QuerySet의 Instance 
            results.append(
                {
                    "name"   : dog.name,	# Instance의 Field들
                    "age"    : dog.age,
                    "owner"  : dog.owner.name
                }
            )
        return JsonResponse({'resutls':results}, status=200)

위의 Class들은 단순히 각 Table의 정보를 불러오는 것이지만, 3번째 Class는 1번 코드에 더해 주인이 가진 강아지들의 정보 리스트를 추가해야 했다. 리스트를 작성하기 위해서는

  • Dog Table에서 특정 주인을 가진 강아지 Instance를 QuerySet으로 뽑아내기(Filetr())
  • QuerySet에서 각 Instance가 가진 특정 Field(name, age)들을 뽑아내기
  • 뽑아낸 정보를 list에 추가하기(values())

의 프로세스를 거치면 된다고 생각했다. 그에 따라 아래와 같은 class를 작성했다.

class GetDogOwner(View):
    def get(self, request):
        owners = Owner.objects.all()
        results=[]

        for owner in owners:
            list= []			# Iteration마다 초기화
            for dog in Dog.objects.filter(owner = owner).values('name', 'age'):
                list.append(dog) 	# { "name" : name, "age" : age } 형태의 dictionary 추가
            results.append(
                {
                    "name" : owner.name,
                    "age"  : owner.age,
                    "dogs" : list
                }
            )
        
        return JsonResponse({'resutls':results}, status=200)
 

작성한 View Class가 기능을 제대로 수행하는지 보기 위해 우선 urls mapping을 마무리했다. 여러 class를 사용하기 위해 path를 잘 지정해주는 것이 중요하다는 것을 POST Method를 구현하며 느꼈다.

# owners/urls.py
from django.urls import path

from owners.views import *

urlpatterns = [
	path('owners', OwnerRegister.as_view()),
  	path('dogs', DogRegister.as_view()),
    	path('getdog', GetDogs.as_view()),
    	path('getowner', GetOwners.as_view()),
    	path('getdogowner', GetDogOwner.as_view()),
]

이제 서버를 실행하고 httpie로 Django 서버에 요청을 보냈더니 결과가 잘 떴다!

http -v GET 127.0.0.1:8000/owners/getowner
http -v GET 127.0.0.1:8000/owners/getdog
http -v GET 127.0.0.1:8000/owners/getdogowner


POST Method에 대해 View를 구현하고 제대로 기능을 수행하는 걸 확인한 후라 그런지 GET Method의 View를 구현하는 것은 그리 오래 걸리지 않았다. 주인이 소유한 강아지 정보를 뽑는 QuerySet Method를 filter()values()를 사용했는데, 이것 말고 좀 더 편한 방법이 있지 않을까 더 생각해봐야겠다.

profile
어디를 가든 마음을 다해 가자

0개의 댓글