개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
2월 14일(월)
Django views.py
CREATE(POST)
import json
from django.http import JsonResponse
from django.views import View
from owners.models import Owner, Dog
class OwnersView(View):
def post(self, request):
try:
data = json.loads(request.body)
Owner.objects.create(
name = data['owner_name'],
email = data['email'],
age = data['owner_age']
)
return JsonResponse({'message' : 'created'}, status=201)
except KeyError:
return JsonResponse({'message' : 'KeyError'}, status=400)
- json 모듈의 loads 함수는 HTTP request로 부터 받는 json 객체를 파이썬의 dictionary 형태로 변환해주는 코드이다. (HTTP request의 body에 존재하는 json 데이터를 딕셔너리 형태로 변환시켜줌)
- Owner.objects.create() 코드는 database의 테이블에 데이터를 추가해주는 Model method 이다.
- 위의 Model method 명령이 실행되면 생성된 데이터는 인스턴스 형태로 반환된다.
- data 객체의 속성 값들은 data 안에 존재하는 dictionary의 key값을 의미한다.
- try-except문은 혹시라도 발생 가능한 KeyError를 예외처리 해주기 위한 코드 구문이다.
- HTTP request에서 보내주는 key 값이 장고의 views.py에 정의된 key 값과 일치하지 않을 경우 KeyError가 발생한다.
- 만약, KeyError가 발생하면 JsonResponse 모듈의 기능에 의해 json 형태로 KeyError 메세지와 status code 400을 함께 반환해준다.
READ(GET)
import json
from django.http import JsonResponse
from django.views import View
from owners.models import Owner, Dog
class OwnersView(View):
def get(self, request):
owners = Owner.objects.all()
results = []
for owner in owners:
dogs = owner.dog_set.all()
for dog in dogs:
results.append(
{
"name" : owner.name,
"age" : owner.age,
"email" : owner.email,
"dog_info" : {
"dog_name" : dog.name,
"dog_age" : dog.age
}
}
)
return JsonResponse({'results': results}, status=200)
- Owner.objects.all() 코드는 database의 Owner 테이블에 존재하는 모든 데이터를 가져오는 Model method 이다.
- dogs = owner.dog_set.all() 코드는 Owner 테이블에서 역참조로 Dog 테이블로 이동한 후에 해당 테이블(Dog)에 존재하는 모든 데이터를 가져오는 Model method 이다. (가져온 데이터는 변수 dogs에 할당해줌)
- 참고로, database의 table 간 정참조, 역참조 개념은 테이블 관계가 1 : N, M : N 관계일 때 사용되는 개념이다.
- 예를 들어, 테이블 관계가 1 : N인 상황일 때 N의 테이블에서 1의 테이블로 데이터를 참조하는 것을 정참조라고 한다. (ex. dog.owner.email, dog.owner.name)
- 반면에, 테이블 관계가 1 : N인 상황일 때 1의 테이블에서 N의 테이블로 데이터를 참조하는 것을 역참조라고 한다. (ex. owner.dog_set.all())
- 역참조를 사용할 때, 모델클래스명_set 대신 related_name을 사용할 수도 있다.
- 단, related_name은 Foreign Key가 걸려있는 모델 클래스의 속성에 인자 값으로 존재해야 한다.
'기타' 카테고리의 다른 글
TIL - 22.02.16 (0) | 2022.02.16 |
---|---|
TIL - 22.02.15 (0) | 2022.02.16 |
TIL - 22.02.11 (0) | 2022.02.11 |
TIL - 22.02.10 (0) | 2022.02.10 |
TIL - 22.02.09 (0) | 2022.02.09 |
댓글