위코드 2주차에는
스타벅스 메뉴와 상품들에 대한 정보를 Django를 통해
MySQL DB에 저장하는 과정에 대해 배웁니다.
안내되어 있기로는 python shell을 사용하라고 되어 있긴 한데...
하나하나 넣기에는 너무 귀찮아서ㅎㅎ
그냥 서버 request 받으면 한번에 처리되도록 로직을 작성하였습니다.
(그리고 찾아보니 저처럼 csv 파일 사용하시는 분들이 몇 계시더군요)
(my_project/products/models.py 중 Nutrition class)
class Nutrition(models.Model):
one_serving_kcal = models.DecimalField(max_digits=6, decimal_places=2)
sodium_mg = models.DecimalField(max_digits=6, decimal_places=2)
fat_g = models.DecimalField(max_digits=6, decimal_places=2)
sugars_g = models.DecimalField(max_digits=6, decimal_places=2)
protein_g = models.DecimalField(max_digits=6, decimal_places=2)
caffeine_mg = models.DecimalField(max_digits=6, decimal_places=2)
class Meta:
db_table = 'nutritions'
140, 1, 2, 10, 8, 200
80, 0, 0, 11, 0, 240
235, 3, 10, 8, 4, 185
480, 8, 14, 18, 5, 220
100, 1, 2, 0, 0, 180
300, 5, 5, 10, 5, 230
사실 이 csv 파일 작성하는 것도 귀찮았습니다.
좀 더 실력이 좋아지면 웹 크롤링으로 데이터를 긁어올 수 있겠죠..?
my_project/products/views.py 내용
# views.py의 import 목록
import csv
from django.shortcuts import render
from django.http import HttpResponse
# db 모델들.. 여기서는 Nutrition만 쓸 예정
from .models import Menu, Category, Drink, Nutrition, Allergy, Image
data = None
file_dir = 'my_csv_file_directory'
def read_data(table_name):
with open(file_dir + f'{table_name}.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
global data
data = list(reader)
return
1-2 와 1-3에서 중요한 점: 한 번 연 파일은 꼭 다시 닫아야!
def footer(table_name, class_name, bulk_list):
class_name.objects.bulk_create(bulk_list)
with open(file_dir + f'{table_name}.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
return
def add_nutritions(request):
read_data('nutritions')
if not data:
return HttpResponse('Nothing to update')
arr = []
for row in data:
arr.append(Nutrition(
one_serving_kcal=row[0],
sodium_mg=row[1],
fat_g=row[2],
sugars_g=row[3],
protein_g=row[4],
caffeine_mg=row[5]
))
footer('nutritions', Nutrition, arr)
return HttpResponse('Nutritions table updated')
my_project/products/urls.py 내용
from django.urls import path
from .views import add_nutritions
urlpatterns = [
path('nutritions/', add_nutritions)
]
my_project/my_project/urls.py 내용
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('products/', include('products.urls'))
]
결과
table에 정상적으로 입력 완료
[Django] DateTimeField column으로 이것저것 해보기 / __range(), __lt, __gt, __month 등등 (3) | 2021.03.31 |
---|---|
[MySQL, Django]ManyToManyField를 쓰는 이유 (2) | 2021.03.30 |
[MySQL, Django] 관계 설정하기 (일대일, 일대다, 다대다) (0) | 2021.03.30 |
댓글 영역