Django CRUD #1을 통해 MVT Pattern의 Model을 작성하고 Database와 통신하는 법을 배웠다. CRUD #2 에서는 HTTP 통신을 이용해 Client - Server - Database의 data flow를 이해하고, Django Application을 통해 Request를 처리하기 위한 Logic(View)을 실행시켜 Database와 통신(Model)하고 데이터 작업을 수행하여 요청에 맞는 응답을 낼 수 있는 Backend API를 구현한다.
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번 코드에 더해 주인이 가진 강아지들의 정보 리스트를 추가해야 했다. 리스트를 작성하기 위해서는
의 프로세스를 거치면 된다고 생각했다. 그에 따라 아래와 같은 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()
를 사용했는데, 이것 말고 좀 더 편한 방법이 있지 않을까 더 생각해봐야겠다.