[Django] C.R.U.D -2 (1)

김가람휘·2022년 2월 15일
0

Django

목록 보기
7/13

주인과 강아지

# owners/models.py
from django.db import models

class Owner(models.Model):
    name = models.CharField(max_length=20)
    email = models.CharField(max_length=100)
    age = models.IntegerField()

    class Meta:
        db_table = 'owners'

class Dog(models.Model):
	# dog -> owner 정참조, owner -> dog 역참조
    owner = models.ForeignKey('Owner', on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    age = models.IntegerField()

    class Meta:
        db_table = 'dogs'
# main/urls.py
from django.urls import path, include

urlpatterns = [
    path('', include('owners.urls'))
]
# owners/urls.py
from django.urls import path

from owners.views import OwnersView, DogsView, OwnersDogsView

urlpatterns = [
    path('owners', OwnersView.as_view()), # owner 뷰
    path('dogs', DogsView.as_view()), # dog 뷰
    path('ownersdogs', OwnersDogsView.as_view()) # owner+dog 뷰
]
# owners/views.py
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:
            # Json -> dictionary
            data      = json.loads(request.body)
            Owner.objects.create( # owner 객체 생성
			  	# id    = data['id'], 
                name  = data['name'], # 받은 데이터의 name을 name에 저장
                email = data['email'], # 받은 데이터의 email을 email에 저장
                age   = data['age'] # 받은 데이터의 age을 age에 저장
            )
            return JsonResponse({'messasge':'created'}, status=201) # 잘 생성되었을 때 반환되는 메시지
    
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'},status=400) # 키에러시 반환되는 메시지

    def get(self, request):
        owners = Owner.objects.all() # owner테이블의 모든 레코드를 불러온다.
        results  = [] # owner를 출력할 리스트

        for owner in owners:
           results.append(
               {
                   "name" : owner.name,
                   "email" : owner.email,
                   "age" : owner.age
               }
           )
       
        return JsonResponse({'resutls':results}, status=200) # OK

class DogsView(View):
    def post(self, request):
        data      = json.loads(request.body)
        if not Owner.objects.filter(id=data['owner_id']).exists(): 
            return JsonResponse({'MESSAGE': "Owner Does Not Exist"}, status=404)
            # 존재하지 않는 주인 아이디를 받았을 때 404 에러 반환

        Dog.objects.create(
            # 데이터를 받을 때 이미 존재하지 않는 주인값을 입력하면 위에서 오류가 반환되므로 아래와 같이 나타낼 필요가 없다.
			# owner_id = Owner.objects.get(id=int(data['owner'])).id,
            owner_id = data.owner.id, # 정참조
            name  = data['name'],
            age   = data['age']
        )
        return JsonResponse({'messasge':'created'}, status=201)

    def get(self, request):
        dogs = Dog.objects.all()
        results  = []

        for dog in dogs:
           results.append(
               {
                   "owner" : dog.owner.id, # 정참조
                   "name" : dog.name,
                   "age" : dog.age
               }
           )
       
        return JsonResponse({'resutls':results}, status=200)

class OwnersDogsView(View):
    def get(self, request):
        owners = Owner.objects.all() # owner테이블의 모든 레코드를 도는 owners
        results  = []

        for owner in owners:
            dog_list = []
            # 역참조 -> owners 안에 있는 각각의 owner에 맞는 dog 객체를 전부 가져온다.
            dogs = owner.dog_set.all() 
            # 같은 주인을 가진 강아지들의 이름과 나이를 강아지 리스트에 추가
            for dog in dogs: # 모든 주인을 다 돌때까지 리스트가 각각의 주인이 가진 강아지 리스트로 추가된다.
                dog_list.append({
                    "name" : dog.name,
                    "age" : dog.age
                })
            results.append(
                {
                   "name" : owner.name,
                   "email" : owner.email,
                   "age" : owner.age,
                   "dog" : dog_list
                }
            )
       
        return JsonResponse({'resutls':results}, status=200)


http -v GET 127.0.0.1:8080/owners

http -v GET 127.0.0.1:8080/dogs

http -v GET 127.0.0.1:8080/ownersdogs

0개의 댓글