TIL32 - Owner Using Django

Kiyong Lee·2021년 9월 14일
0

Django

목록 보기
8/35
post-custom-banner

Owner Using Django

1. 문제


2. models.py

from django.db import models

# Create your models here.
class Owners(models.Model) :
    name = models.CharField(max_length=50)
    email = models.EmailField(max_length=150, verbose_name='주인 이메일명')
    age = models.IntegerField()

    class Meta :
        db_table = 'owners'
    


class Dogs(models.Model) :
    owner = models.ForeignKey('Owners', on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    age = models.IntegerField()

    class Meta :
        db_table = 'dogs'

이거는 사진속의 DB처럼 작성해주면 된다.


3. urls.py

요청이 들어왔을 때, 최상위 폴더의 urls.py 에서 1차 식별 후, 프로젝트 폴더의 urls.py 에서

url에 맞는 views.py로 이동하도록 정해준다.

#최상위 폴더의 urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
   path('', include('crud_owner.urls'))
]

#프로젝트 폴더의 urls.py

from django.urls import path
from crud_owner.views import *

urlpatterns = [
    path('viewAll', DogAndOwner.as_view()),
    path('createOwners', OwnersView.as_view()),
    path('createDogs', DogsView.as_view())
]
  1. 기본 주소인 localhost:8000으로 요청이 올 시,
    최상위 폴더 urls.py에서는 crud_owner.urls로 추가 명령을 보내라는 뜻이다.
    (crud_owner는 프로젝트명임)

  2. crud_ownerurls.py를 보면 3가지의 path가 있다.
    /viewAll로 들어오면 views.py에서 DogAndOwner 클래스를,
    /createOwners로 들어오면 OwnersView 클래스를,
    /createDogs로 들어오면 DogsView 클래스를 보라는 의미이다.

4. views.py


4-1. DogAndOwner

class DogAndOwner(View) :
    
    def get(self, request) :
        dogs = Dogs.objects.all()
     
        result=[]
       
        for dog in dogs :
            result.append(
                {
                    '개의주인' : Owners.objects.get(id=dog.owner_id).name,
                    '개주인나이' : Owners.objects.get(id=dog.owner_id).age,
                    '개나이' : dog.age,
                    '개들의이름' : dog.name
                }
            )
      
        return JsonResponse({'result':result}, status=200)

개와 주인에 대한 정보를 한 번에 조회하는 데이터를 넘겨주는 클래스이다.

우선, dogs란 변수에 Dogs객체에 있는 모든 데이터를 넣어준다.

그 다음, dogs를 이용해 반복문을 돌리고, 그 결과를 JSONArray 형태로 반환하기 위해

result라는 리스트에 append 함수를 실행해준다.

문제에서 요구했던 것이

강아지 주인의 이름
강아지 주인의 나이
강아지 이름
강아지 나이

이므로 그에 따른 값을 넣어주는 것이다.

다만, 나는 강아지들에 대한 정보를 반복문에 돌렸기 때문에 주인 테이블에 접근하려면

강아지 테이블의 주인ID를 통해 접근해야 했다.

그래서 강아지 주인의 이름을 가져올 때 id를 통해 매칭시키게 되었다.

Owners는 주인의 정보를 저장할 수 있게 만든 클래스이며,

강아지 테이블의 주인ID가 주인 테이블에 존재 하는 경우, 그 주인의 이름과 나이를 가져오라는 뜻이다.

그래서 그 결과를 result라는 리스트에 넣어서 JsonResponse로 리턴해준다.

그 결과 아래 사진처럼 나오는 걸 볼 수 있다.


4-2. OwnersView

class OwnersView(View) :
	
    #GET
    def get(self, request) :
        owners = Owners.objects.all()
  
        result = []

        for owner in owners :
            result.append(
                {
                    'name' : owner.name,
                    'email' : owner.email,
                    'age' : owner.age
                }
            )

        return JsonResponse({'result':result}, status=200)

	#POST
    def post(self, request) :
        data = json.loads(request.body)
        Owners.objects.create(
            name = data['name'],
            email = data['email'],
            age = data['age']
        )
        return JsonResponse({'message':'success'}, status=201)

주인 테이블에 대한 GET/POST 함수이다.

GET
1. owners라는 변수에 Owners의 객체에 대한 데이터 셋을 넣어주고 반복문을 돌려서
2. 리스트에 넣어준 뒤, 그걸 리턴하겠다는 뜻이다.


POST
1. 데이터를 입력하기 위해 값을 KEY-VALUE 형태로 던져주는 걸 Python 객체형태로
    data라는 변수에 저장하겠다는 뜻이다.
2. 그 다음 요청받은 데이터를 이용해 Owners 객체를 만들겠다는 뜻인데,
    name, email, age는 요청 받은 데이터의 변수들이다.

이름과 이메일, 나이를 설정해서 POST 요청을 했다.

굿!


4-3. DogsView

class DogsView(View) : 
    #GET
    def get(self, request) :
        dogs = Dogs.objects.all()
        result = []

        for dog in dogs :
            #이름, 나이, 주인이름
            result.append(
                {
                    'dog_name' : dog.name,
                    'dog_age' : dog.age,
                    'owner_name' : Owners.objects.get(id=dog.owner_id).name
                }
            )
        return JsonResponse({'result':result}, status=200)

    #POST
    def post(self, request) :
        data = json.loads(request.body)
        Dogs.objects.create(
            name = data['name'],
            age = data['age'],
            owner_id = Owners.objects.get(id = int(data['owner'])).id
        )
        return JsonResponse({'result':'success'}, status=201)

위 두 가지 방법은 모두 설명했으니 여기선 생략


5. 후기

멘토님께 내가 이해한대로 과제를 했는데, 이렇게 클래스를 구성하는 게 맞는지 물어봤었고, 코드리뷰도 요청했었다.

우선, 내가 이해했던 방향성이 맞았고 이렇게 구성하는 게 맞다고 해주셨다.

그리고 값도 저장 및 불러오는 데 문제가 없는 것도 확인해주셨다.

그리고 try-except 문을 통해 예외처리를 해주는 게 좋다고 하셨다.

생각해보니 여러 오류에 대해 정리하면 소통하기도 좋을듯

이건 최초본이고 역참조나 try-except 등을 사용해서 수정할 예정이다.

완성본은 여기에서

profile
ISTJ인 K-개발자
post-custom-banner

0개의 댓글