TIL # 39 Django : 문자로 받아서 FK 로 인식하기

채록·2021년 1월 28일
0

Python & Django

목록 보기
16/34
post-thumbnail

드디어..

- 목표

한 table의 filed 값에 FK를 받는 column이 있을때,
POST method로 그 FK가 PK로 존재하는 table의 name을 인식하여 해당하는 FK 로 저장되게 하기!

입력 문자 <-> 해당하는 FK값



red/urls.py

from django.urls import path, include

urlpatterns = [
   path('users', include('users.urls'))

프로젝트 이름 : red
앱 이름 : users

  • request 의 경로가 users로 끝날 경우 users.urls로 요청을 전달한다.


    users/urls.py

from django.urls    import path, include
from .views         import UserView, DogView
urlpatterns = [
    path('', DogView.as_view())
]

프로젝트 urlpatterns의 작동으로 전달된 요청을 받는다.
이때 '' 안에 아무것도 없으므로 users 뒤에 주소가 없을때 받을 수 있다.
최종적으로 users app의 DogView 로 전달한다.

as_view()는 이전에 import 한 View의 속성이다. 대문자로 들어온 request를 소문자로 작성된 함수와 연결시켜 준다.


user/models.py

from django.db import models

# Create your models here.

class User(models.Model):
    # column 정의
    name    = models.CharField(max_length=20)
    age     = models.IntegerField()
    email   = models.EmailField(max_length=100)

    class Meta:
        db_table = 'users'

# name, breed, age, 주인정보 (ForeignKey())

class Dog(models.Model):
    name    = models.CharField(max_length=20)
    breed   = models.CharField(max_length=20)
    age     = models.IntegerField()
    user   = models.ForeignKey('User', on_delete = models.CASCADE)

    class Meta:
        db_table = 'dogs'

특별한 것은 없다.


users/views.py

import json
from django.http.response import HttpResponse

from django.views import View
from django.http import JsonResponse

from .models import User, Dog

class DogView(View):
    def get(self, request):
        dogs = Dog.objects.all()

        dog_list = []

        for dog in dogs:
            dog_info = {
                    'id'    : dog.id,
                    'name'  : dog.name,
                    'breed' : dog.breed,
                    'age'   : dog.age,
                    'user'  : dog.user.name,
                    }
            dog_list.append(dog_info)

        print('안녕! 멍멍이들!)

        return JsonResponse({'안녕 강아지들!' : dog_list}, status=200)



    def post(self, request):

        data = json.loads(request.body)

        name = data['name']
        breed = data['breed']
        age = data['age']
        user_id = User.objects.get(name=data['user']).id

        dog = Dog.objects.create(name=name, breed=breed, age=age, user_id=user_id)

        return JsonResponse({'message': f'안녕 {dog.name}!'}, status=201)

users/views.py 코드 설명

1) POST method

  • dogs table에 존재하는 user에 대한 정보는 user의 PK가 FK 로 인식되어 있는 형태이다. 때문에 새로운 data가 저장될때 역시 FK 로 저장되어야 한다.

  • 따라서 name=data['user'] 인 객체의 id를 받아와서 이를 user_id 에 저장시켰다.


2) GET method

  • dogs의 user 에 대한 값은 key값이다. 때문에 정참조의 방식으로 dot(.) 을 통해 값을 한번 더 출력하여야 한다.


- http POST 결과



- http GET 결과




보충할 것

  • users/urls.py 에 한가지 경로를 계속 수정해서 사용하는데 이거 고치기 DogView <-> UserView

  • post method 사용 시 이미 존재하는 값에 대한 처리 방안 모색

  • 에러 발생 시 서버가 종료되지 않게 처리하기 try / except

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글