각 기능을 서로 다른 클래스로 구현해주세요.
위 기능을 구현 후 직접 httpie 를 활용하여 주인 2명의 정보와 각 주인 당 2~3마리의 강아지 정보를 데이터베이스에 저장해주세요.
from django.db import models
project name : owner_dog
app name : dogs_info
from django.db import models
class Owner(models.Model):
name = models.CharField(max_length=20),
email = models.EmailField(max_length=128),
age = models.IntegerField()
class Meta :
db_table = "owners"
class Dog(models.Model):
owner = models.ForeignKey(Owner, on_delete=models.CASCADE),
name = models.CharField(max_length=20),
age = models.IntegerField()
class Meta:
db_table = "dogs"
mysql> create database owner character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| owner |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.02 sec)
mysql> use owner
use owner
^C
mysql> use owner;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------+
| Tables_in_owner |
+-------------------+
| django_migrations |
| dogs |
| owners |
+-------------------+
3 rows in set (0.00 sec)
from django.urls import path, include
urlpatterns = [
path('dogs_info', include('dogs_info.ursls'))
]
from django.urls import path
from .views import OwnerView, DogView
urlpatterns = [
path('/owners', OwnerView.as_view())
path('/dogs', DogView.as_view())
]
Views 뜯기.
장고는 request와 response 객체로 상태를 서버와 클라이언트가 주고 받습니다. 이를 위해 장고는 django.http 모듈에서 HttpRequest와 HttpResponse API를 제공 합니다.
서버-클라이언트 통신 시 아래와 같은 절차로 데이터가 오고 갑니다.
1) 특정 페이지가 요청(리퀘스트)되면, 장고는 요청 시 메타데이터를 포함하는 HttpRequest 객체를 생성
2) 장고는 urls.py에서 정의한 특정 View 클래스/함수에 첫 번째 인자로 해당 객체(request)를 전달
3) 해당 View는 결과값을 HttpResponse 혹은 JsonResponse 객체에 담아 전달
import json
from django.http import JsonResponse
from django.views import View
from .models import Owner,Dog
# Create your views here.
프론트엔드 에서 받는 제이슨 형식의 요청의 바디를 적제 하겠다.
JSON 디코딩은 json.loads() 메서드를 사용하여 문자열을 Python 타입으로 변경하게 된다.
data = json.loads(request.body)
class OwnerView(View):
def post(self, request):
data = json.loads(request.body)
Owner.objects.create(
name = data['name']
email = data['email']
age = data['age']
)
return JsonResponse({'message':'SUCCESS'}, status=201)
def **get**(self, request):
result =[]
owners =Owner.objects.all()
for owner in owners:
dogs= owner.dog_set.all()
dog_list = []
for dog in dogs:
dog_information ={
'name': dog.name
'age' : dog.age
}
dog_list.append(dog_information)
owner_information = {
'name' : owner.name,
'email': owner.email,
'age' : owner.age
}
result.append(owner_information)
return JsonResponse({'result':result}, status=200)
http -v POST 127.0.0.1/dogs_info/gods name='홍태경' age =12 owner='KIM'
def post(self, request):
data =json.loads(request.body) # 프론트에서 데이터 받기
# owner라는 이름을 불러올것이다 .
오너라는 변수에 오너 객체를 하나 불러온다 이름이 프론트에서 준 KIM 이라는 이름을 가진 오너 객체를 오너에 담음
**owner =Owner.objects.get(name=data['owner'])**
Dog.objects.create(
name= data['name']
age=data['age']
#owner.id를 하면 오너 테이블에 있는 것을 불러오는 것이다.
owner_id= owner.id
**or **
owner = owner # 단점 : 오너에 없는 이름의 데이터베이스가 들어온다면?
does not exist 라고 특정 이름을 가진 오너가 없다라고 나온다.
예외처리까지 모두 신경을 써야한다.
or
owner_id= data['owner_id']
)
return JsonResponse({'message':'SUCCESS'}, status=201)
def get(self, request):
result =[]
dogs = Dog.objects.all()
for dog in dogs:
dog_information = {
'name' : dog.name,
'age' : dog.age,
'owner': dog.owner.name
}
result.append(dog_information)
return JsonResponse({'result':result},status=200)
테스트
1. runserver 실행
2.
python manage.py runserver 8080
http -v POST 127.0.0.1:8080/dogs_info/owners name='홍태경' email='wefw@naver.com' age:= 21