[Django] Django C.R.U.D (2) 과제

홍태경·2021년 4월 1일
0

순서

  • models.py 에서 티비 테이블 생성
  • db 생성 후 셋팅 파일 설정
  • 프로젝트 urls.py
  • 앱 urls.py
  • views.py
  • 통신 테스트

westartbucks/products

from django.db import models

class Menu(models.Model):
17 name= models.CharField(max_length=20)
16
15 class Meta:
14 ¦ db_table = 'menus'
13
12 class Category(models.Model):
11 name = models.Charfield(max_length=20)
10 menu = models.ForeignKey('Menu',on_delete=models.CASCADE)
9
8 class Meta:
7 ¦ db_table = 'categories'
6
5 class Product(models.Model):
4 name = models.CharField(max_length = 100)
3 price = models.IntegerField()
2 category = models.ForeignKey('Category',on_delete=models.CASCADE)
1 class Meta:
24 ¦ db_table ='products'

db생성 후 셋팅 파일 적용 및 셋팅

mysql> create database startbucks character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| django |
| dog |
| information_schema |
| mysql |
| performance_schema |
| startbucks |
| sys |
+--------------------+
7 rows in set (0.00 sec)

mysql> use startbucks
Database changed
mysql> show tables;
Empty set (0.00 sec)

DEBUG = False
ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [

  1 #    'django.contrib.admin',
35  #    'django.contrib.auth',
'products',

MIDDLEWARE = [

#    'django.middleware.csrf.CsrfViewMiddleware',
  6 #   'django.contrib.auth.middleware.AuthenticationMiddleware',

ATABASES = {

    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'startbucks',
        'USER': 'root',
        'PASSWORD': 'ubuntu',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

프로젝트 urls.py

from django.urls import path, include                                 
    3                                                                       
    2 urlpatterns = [                                                       
✖   1     path('products',include('products.urls'))   
  20  ]

앱 urls.py


4 from django.urls import path
  3 from .views import ProductsView
  2 
  1 urlpatterns =[            
5       path('', ProductsView.as_view())
  1     ¦   ] 

views.py

products/views.py
import json
from django.http     import JsonResponse

from django.views    import View
from products.models import Menu, Category, Product

class ProductsView(View):

    def post(self, request):               # post method
        data = json.loads(request.body)
        menu = Menu.objects.create(name=data['menu'])
        category = Category.objects.create(
                name=data['category'],
                menu=menu
        )
        product = Product.objects.create(
                name=data['product']['name'],
                price=data['product']['price'],
                category=category
        )
        return JsonResponse({'MESSAGE':'SUCCESS'}, status=201)


    def get(self, request):                  # get method
        products = Product.objects.all()
        results = []
        for product in products:
            results.append(
                    {
                    "menu":product.category.menu.name,
                    "category":product.category.name,
                    "product" :product.name
                    }
                                ) 
        return JsonResponse({'results':results}, status=200)  

통신 테스트

python manage.py makemigrations products
Migrations for 'products':
products/migrations/0001_initial.py
- Create model Category
- Create model Menu
- Create model Product
- Add field menu to category

python manage.py migrate products

python manage.py runserver 8080
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 01, 2021 - 12:02:22
Django version 3.1.7, using settings 'westarbucks.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CONTROL-C.

Error: That port is already in use.

❯ http -v POST 127.0.0.1:8080/products menu='음료' category='콜드브루' product:='{"name":"맛있는 콜드브루", "price":5400}'

201 이 안나오니 실패다..

http -v POST 127.0.0.1:8080/products menu='음료' category='콜드브루' product:='{"name":"맛있는 콜드브루", "price":5400}'
POST /products HTTP/1.1
Accept: application/json, /
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 147
Content-Type: application/json
Host: 127.0.0.1:8080
User-Agent: HTTPie/1.0.3

{
"category": "콜드브루",
"menu": "음료",
"product": {
"name": "맛있는 콜드브루",
"price": 5400
}
}

HTTP/1.1 404 Not Found
Content-Length: 179
Content-Type: text/html
Date: Thu, 01 Apr 2021 12:05:41 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.2
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

Not Found

Not Found

The requested resource was not found on this server.

아.. 안됐네..
mysql> select * from menus;
Empty set (0.00 sec)

mysql> select * from products;
Empty set (0.00 sec)

기존에 런서버가 있었다 이걸 지우고 다시 해보니

성공하였다

POST /products HTTP/1.1
Accept: application/json, /
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 147
Content-Type: application/json
Host: 127.0.0.1:8080
User-Agent: HTTPie/1.0.3

{
"category": "콜드브루",
"menu": "음료",
"product": {
"name": "맛있는 콜드브루",
"price": 5400
}
}

HTTP/1.1 201 Created
Content-Length: 22
Content-Type: application/json
Date: Thu, 01 Apr 2021 12:08:53 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.8
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
"MESSAGE": "SUCCESS"
}

mysql> select * from products;
+----+------------------------+-------+-------------+
| id | name | price | category_id |
+----+------------------------+-------+-------------+
| 1 | 맛있는 콜드브루 | 5400 | 1 |
+----+------------------------+-------+-------------+
1 row in set (0.01 sec)

클라이 언트에서 get 요청하기

http -v GET 127.0.0.1:8080/products
GET /products HTTP/1.1
Accept: /
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 127.0.0.1:8080
User-Agent: HTTPie/1.0.3

HTTP/1.1 500 Internal Server Error
Content-Length: 145
Content-Type: text/html
Date: Thu, 01 Apr 2021 12:12:57 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.8
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

Server Error (500)

Server Error (500)

views.py 에 get 쪽을 가보자

맨 아래 오타를 찾았따
return JsonResponse ({'results':results}, status=200)

http -v GET 127.0.0.1:8080/products
GET /products HTTP/1.1
Accept: /
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 127.0.0.1:8080
User-Agent: HTTPie/1.0.3

HTTP/1.1 200 OK
Content-Length: 137
Content-Type: application/json
Date: Thu, 01 Apr 2021 12:17:52 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.8
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
"results": [
{
"category": "콜드브루",
"menu": "음료",
"product": "맛있는 콜드브루"
}
]
}


내일 예습 할 때 이해를 돕기 위해 임시 저장소,
난 딕셔너리가 너무 너무 어렵다.. 딕셔너리좀 제대로 리뷰 해봐야겠다..

  • products 는 prodject name/urls.py
  • nemu는 앱 모델 테이블 name 1 (실질적으로 1개)
  • category 역시 모델 테이블 name 1 , 외래키 1 (실질적으로 1개
  • product 모델 테이블 name1 , price 1 외래키 1 (실질적으로 2개 딕셔너리

http -v POST 127.0.0.1:8080/products menu**='음료'** category='콜드브루' product:='{"name":"맛있는 콜드브루", "price":5400}'

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

class Menu(models.Model):
17 name= models.CharField(max_length=20)
16
15 class Meta:
14 ¦ db_table = 'menus'
13
12 class Category(models.Model):
11 name = models.Charfield(max_length=20)
10 menu = models.ForeignKey('Menu',on_delete=models.CASCADE)
9
8 class Meta:
7 ¦ db_table = 'categories'
6
5 class Product(models.Model):
4 name = models.CharField(max_length = 100)
3 price = models.IntegerField()
2 category = models.ForeignKey('Category',on_delete=models.CASCADE)
1 class Meta:
24 ¦ db_table ='products'

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

mysql> show tables;
+-------------------+
| Tables_in_django |
+-------------------+
| categories |
| django_migrations |
| menus |
| products |
+-------------------+
4 rows in set (0.00 sec)

mysql>
mysql> select * from menus
-> ;
+----+--------+
| id | name |
+----+--------+
| 1 | 음료 |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from products;
+----+------------------------+-------+-------------+
| id | name | price | category_id |
+----+------------------------+-------+-------------+
| 1 | 맛있는 콜드브루 | 5400 | 1 |
+----+------------------------+-------+-------------+
1 row in set (0.00 sec)

mysql> select from category
-> ;
ERROR 1146 (42S02): Table 'django.category' doesn't exist
mysql> select
from category;
ERROR 1146 (42S02): Table 'django.category' doesn't exist
mysql> select * from categories;
+----+--------------+---------+
| id | name | menu_id |
+----+--------------+---------+
| 1 | 콜드브루 | 1 |
+----+--------------+---------+
1 row in set (0.00 sec)

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

0개의 댓글