이번에는 models.py 작성에 이어 views.py와 urls.py 작성법을 알아보겠습니다.
views.py는 models.py에서 작성한 class를 기반으로 각각에 해당하는 View 클래스를 작성합니다. 그리고 각 class내에는 post함수와 get함수를 작성하는데, post함수는 정보를 입력, get함수는 정보를 가져오는 역할을 합니다.
먼저 views.py 작성에 필요한 모듈을 모두 불러옵니다.
import json # json데이터를 처리하기 위해 import
from django.http import JsonResponse # django.http에서 서버의 요청에 대한 응답을 Json으로 응답하기 위해 JsonResponse import
from django.views import View # django.views에서 View import
from owners.models import Owner, Dog
그리고 각 클래스를 아래와 같이 작성합니다.
class OwnersView(View): # Django에 내장되어 있는 View class 상속
def post(self, request):
data = json.loads(request.body) # body부분의 문자열을 python 타입으로 변경
Owner.objects.create( # Owner의 객체를 생성(models.py에서 작성한 내용에 따라 작성
name=data['owner'],
email=data['owner_email'],
age=data['owner_age']
)
return JsonResponse({'MESSAGE': 'CREATED'}, status=201)
def get(self, request):
owners = Owner.objects.all() # Owner의 모든 객체를 owners에 할당
results = [] # 결과값에 해당하는 리스트 생성
for owner in owners: # owners의 객체를 하나씩 불러옴(쿼리셋 풀림)
dog_list = [] # dog의 리스트 생성
results.append( # 각 해당하는 owner의 값을 append
{
"owner": owner.name,
"owner_email": owner.email,
"owner_age": owner.age,
"dog_list": dog_list,
}
)
dogs = owner.dog_set.all() # owner에서 dog를 불러오기 위해 역참조 _set.all() 사용
for dog in dogs:
dog_list.append( # dog의 해당 값을 append
{
"dog_name": dog.name,
"dog_age": dog.age,
}
)
return JsonResponse({'results': results}, status=200)
class DogsView(View):
def post(self, request):
data = json.loads(request.body) # body부분의 문자열을 python 타입으로 변경
Dog.objects.create( # models.py의 Dog class에 해당하는 모든 객체 생성
owner_id=data['owner_id'],
name=data['dog'],
age=data['dog_age']
)
return JsonResponse({'MESSAGE': 'CREATED'}, status=201)
def get(self, request):
dogs = Dog.objects.all() # models.py의 Dog class에 해당하는 모든 객체를 불러옴
results = [] # 결과값을 위한 리스트 생성
for dog in dogs: # 각 dog의 객체를 불러옴(쿼리셋 풀림)
results.append( # 해당 값을 append
{
"owner": dog.owner.name,
"dog": dog.name,
"dog_age": dog.age
}
)
return JsonResponse({'results': results}, status=200)
views.py 작성이 끝나면 urls.py를 작성하여 연결해주어야 합니다.
먼저 app폴더에 urls.py를 생성해줍니다.(저의 경우 owners)
그 후 프로젝트 폴더의 urls.py와 app폴더의 urls.py를 서로 연결시켜 관리합니다.
# 프로젝트 폴더 내의 urls.py
from django.urls import path, include
urlpatterns = [ # - urlpatterns의 path함수는 url과 명령을 연결하는 역할을 합니다.
path('owners', include('owners.urls')), # 경로가 owners인 경우 owners.urls로 연결하여 이동
]
# app 폴더 내의 urls.py
from django.urls import path # django.urls의 path 가져오기
from django.urls.resolvers import URLPattern
from owners.views import DogsView, OwnersView # views.py에서 DogView, OwnersView class 가져오기
urlpatterns = [
path('', OwnersView.as_view()), # 경로가 ''일때, OwnersView class에 as_view()함수를 실행 => http method가 get인지 post인지 delete인지 update인지등을 판별하여 함수를 실행
path('/dogs', DogsView.as_view()), #경로가 '/dogs'일때, DogsView class에 as_view()함수를 실행 => http method가 get인지 post인지 delete인지 update인지등을 판별하여 함수를 실행
]