TIL-034 | Django_C.R.U.D #2

Lee, Chankyu·2021년 11월 2일
1
post-thumbnail
post-custom-banner

C.R.U.D 2 실습

  • 지난 C.R.U.D 1을 통해 django의 model을 작성하여 database에 반영하는 것을 진행하였다. 또한 생성된 table에 원하는 data를 입력하는 것 까지 완료할 수 있었다.
  • 이번 C.R.U.D 2를 통해서는 HTTP 통신을 통해 client와 server, 그리고 database 간의 flow를 이해하고 Client의 request를 처리하기 위한 View 작성을 해보도록 한다.

🌈 주인과 강아지

  • 위와 같은 ERD를 참고하여 적절한 Django Model을 작성한 후 Database와 연동한다.
  • 신규 주인을 등록하고 강아지 정보를 등록(주인정보 필요)하는 POST Method의 View Class를 구현한다.
  • 주인 리스트, 강아지 리스트, 주인 리스트(이름,나이,키우는 강아지 포함)를 GET 하는 View Class를 구현한다.

1. 클라이언트 준비

  • Server에 HTTP request를 요청 할 수 있는 Httpie를 설치하여 준다.

    $ brew install httpie

  • httpie를 통해 request 를 보낼 수 있는 명령어는 아래와 같다.

    $ http -v method(POST, GET 등) 127.0.0.1:8000/[url 경로] key1="value1" key2="value2" key3="value3"

👉 request 보낼 시 띄어쓰기, 쉼표, 따옴표 등에 주의하여 한다. 첫 요청시 습관적으로 쉼표와 띄어쓰기(등호양옆)를 추가하여 에러가 발생하였다.

❗ 내가 보낸 잘못된 요청의 예시
$ http -v method(POST, GET 등) 127.0.0.1:8000/[url 경로] key1 = "value1", key2 = "value2"

2. models 구현

  • ERD를 참고하여 내가 작성한 models는 아래와 같다.
from django.db import models

class Owner(models.Model):
    name = models.CharField(max_length=45)
    email = models.CharField(max_length=300)
    age = models.IntegerField(default=0)

    class Meta:
        db_table = 'owners'

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.CASCADE)
    name = models.CharField(max_length=45)
    age = models.IntegerField(default=0)

    class Meta:
        db_table = 'dogs'
  • Database 적용

    $ python manage.py makemigrations
    $ python manage.py migrate

3. Views 구현(클래스형 view)
👉 POST method와 GET method의 로직을 처리할 수 있는 View class를 구현하였다.

class OwnersView(View):
    def post(self, request):
        data = json.loads(request.body)
        owner = Owner.objects.create(
            name = data['name'],
            email = data['email'],
            age = data['age'],
        )
        return JsonResponse({'MESSAGE' : 'SUCCESS'}, status = 201)

class DogsView(View):
    def post(self, request):
        data = json.loads(request.body)
        dog = Dog.objects.create(
            name = data['name'],
            age = data['age'],
            owner = Owner.objects.get(name=data['owner'])
        )

        return JsonResponse({'MESSAGE' : 'SUCCESS'}, status = 201)
  • owners의 정보 생성을 요청하는 클래스와 dogs의 정보 생성을 요청하는 클래스를 구현하였다.
class GetOwners(View):
    def get(self, request):
        owners = Owner.objects.all()
        results = []
        for owner in owners:
            dogs = Dog.objects.filter(owner=owner).values('name','age')
            dog_list = []
            for dog in dogs:

                dog_list.append(dog)
                
            results.append(
                {
                    "name" : owner.name,
                    "email" : owner.email,
                    "age" : owner.age,
                    "dog" : dog_list
                }
            )
        return JsonResponse({'RESULTS' : results}, status = 200)

class GetDogs(View):
    def get(self, request):
        dogs = Dog.objects.all()
        results = []
        for dog in dogs:
            results.append(
                {
                    "name" : dog.name,
                    "age" : dog.age,
                    "owner" : dog.owner.name
                }
            )
        return JsonResponse({'RESULTS' : results}, status = 200)
  • GET 요청을 처리할 수 있는 로직이며 filter() 와 같은 Queryset API를 사용하였다. 이를 좀 더 숙련되게 사용할 수 있도록 꾸준한 연습이 필요하다.

4. url 맵핑

#Main urls.py
from django.urls import path, include

urlpatterns = [
    path('ownersdogs/', include('ownersdogs.urls')),
    ]
  • ownersdogs app의 urls.py로 연결 되도록 맵핑한다.
# App내 urls.py
from django.urls import path

from ownersdogs.views import GetDogs, GetOwners, OwnersView, DogsView 

urlpatterns = [
    path('owners', OwnersView.as_view()), 
    path('dogs', DogsView.as_view()),
    path('getowner', GetOwners.as_view()),
    path('getdog', GetDogs.as_view()),
]
  • main의 urls.py에서 넘어온 요청을 메소드에 따라 미리 작성한 view의 로직으로 처리 할 수 있도록 맵핑한다.

✅ 요청 성공 Message


👉 습관적으로 콤마(,)를 삽입하여 데이터에 그대로 삽입되는 현상이 나타났다. httpie를 이용한 요청을 할 때는 헷갈리지 않도록 주의를 기울여야 겠다.


👉 Database에 잘 저장된 것을 확인 할 수 있다.


📝 Feedback

  • 데이터 저장시 콤마(,)가 들어가지 않도록 주의 한다.

  • class 이름은 단수 명사형으로 사용하도록 한다. (OwnersView -> OwnerView)

  • Owner테이블에 접근해서 데이터를 처리 하는 기능은 같은 클래스에 두는 것이 좋다.

# ex)
class OwnerView(view):
 def post(self, request):
 ...
 def get(self, request):
profile
Backend Developer - "Growth itself contains the germ of happiness"
post-custom-banner

0개의 댓글