django 주인과 강아지(필수 과제)

홍태경·2021년 4월 3일
1

주인과 강아지 (필수 과제)

각 기능을 서로 다른 클래스로 구현해주세요.

  1. 신규 주인 등록
  2. 강아지 등록 (주인정보 필요)

위 기능을 구현 후 직접 httpie 를 활용하여 주인 2명의 정보와 각 주인 당 2~3마리의 강아지 정보를 데이터베이스에 저장해주세요.

from django.db import models

Create your models here.

  • dogs_info/models.py
  • mysql
  • owner_dog/urls.py
  • dogs_info urls.py

project name : owner_dog
app name : dogs_info

dogs_info/models.py

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

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)

vim owner_dog/urls.py

from django.urls import path, include

urlpatterns = [
path('dogs_info', include('dogs_info.ursls'))
]

dogs_info/urls.py

from django.urls import path
from .views import OwnerView, DogView

urlpatterns = [

path('/owners', OwnerView.as_view())
path('/dogs', DogView.as_view())


    ]

dogs_info/Views.py

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.

runserver 실행

python manage.py runserver 8080

http -v POST 127.0.0.1:8080/dogs_info/owners name='홍태경' email='wefw@naver.com' age:= 21

profile
나의 에고를 인정하고 사랑하자

0개의 댓글