드디어..
한 table의 filed 값에 FK를 받는 column이 있을때,
POST method로 그 FK가 PK로 존재하는 table의 name
을 인식하여 해당하는 FK 로 저장되게 하기!
입력 문자 <-> 해당하는 FK값
from django.urls import path, include
urlpatterns = [
path('users', include('users.urls'))
프로젝트 이름 : red
앱 이름 : users
request 의 경로가 users로 끝날 경우 users.urls
로 요청을 전달한다.
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를 소문자로 작성된 함수와 연결시켜 준다.
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'
특별한 것은 없다.
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)
dogs table에 존재하는 user에 대한 정보는 user의 PK가 FK 로 인식되어 있는 형태이다. 때문에 새로운 data가 저장될때 역시 FK 로 저장되어야 한다.
따라서 name=data['user'] 인 객체의 id를 받아와서 이를 user_id 에 저장시켰다.
정참조
의 방식으로 dot(.) 을 통해 값을 한번 더 출력하여야 한다.
users/urls.py 에 한가지 경로를 계속 수정해서 사용하는데 이거 고치기 DogView
<-> UserView
post method 사용 시 이미 존재하는 값에 대한 처리 방안 모색
에러 발생 시 서버가 종료되지 않게 처리하기 try / except