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'
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',
}
}
from django.urls import path, include
3
2 urlpatterns = [
✖ 1 path('products',include('products.urls'))
20 ]
4 from django.urls import path
3 from .views import ProductsView
2
1 urlpatterns =[
5 path('', ProductsView.as_view())
1 ¦ ]
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
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
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": "맛있는 콜드브루"
}
]
}
내일 예습 할 때 이해를 돕기 위해 임시 저장소,
난 딕셔너리가 너무 너무 어렵다.. 딕셔너리좀 제대로 리뷰 해봐야겠다..
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)