jango web framework를 활용한 application 개발에 핵심이되는 URLconf, View, Model 중에 Model을 작성하고 ORM을 통해서 Database에 table을 만들고 데이터를 생성, 조회, 수정, 삭제하는 방법을 블로그에 정리 예정
$ mysql.server start
$ mysql -u root -p
mysql> create database "NAME" character set utf8mb4 collate utf8mb4_general_ci;
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DATABASE 명',
'USER': 'root',
'PASSWORD': 'DB접속용 비밀번호',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
from django.db import models
class Menu(models.Model):
name = models.CharField(max_length=45)
class Category(models.Model):
name = models.CharField(max_length=45)
menu = models.ForeignKey ('Menu', on_delete=models.CASCADE)
class Drink(models.Model):
korean_name = models.CharField(max_length=200)
english_name = models.CharField(max_length=200, null=True)
description = models.TextField()
category = models.ForeignKey ('Category', on_delete=models.CASCADE)
class Allegy(models.Model):
name = models.CharField(max_length=45)
class AllegyDrink(models.Model):
allegy = models.ForeignKey('Allegy',on_delete=models.CASCADE)
drink = models.ForeignKey ('Drink',on_delete=models.CASCADE)
class Image(models.Model):
image_url = models.CharField(max_length=2000)
drink = models.ForeignKey ('Drink',on_delete=models.CASCADE)
class Nutrition(models.Model):
one_serving_kcal = models.DecimalField(max_digits = 5, decimal_places = 1)
sodium_mg = models.DecimalField(max_digits = 5, decimal_places = 1)
saturated_fat_g = models.DecimalField(max_digits = 5, decimal_places = 1)
sugars_g = models.DecimalField(max_digits = 5, decimal_places = 1)
protein_g = models.DecimalField(max_digits = 5, decimal_places = 1)
caffeine_mg = models.DecimalField(max_digits = 5, decimal_places = 1)
size_ml = models.CharField(max_length=45)
size_fluid_ounce = models.CharField(max_length=45)
drink = models.ForeignKey ('Drink',on_delete=models.CASCADE)
DECIMAL(5,2) : 전체 5자리중에서 소숫점 2자리까지 확보되었다 라는 의미이다.
max_digits : 숫자에 허용되는 최대 자릿수이다.
decimal_places : 숫자와 함께 저장하는 소수 자릿수의 개수이다.
Table에 데이터를 추가(INSERT) 해주는 method로, 생성된 인스턴스를 반환해준다.
In : Category.objects.create(name='콜드브루')
Out : <Category: Category object (1)>
지정된 조회 매개 변수와 일치하는 인스턴스를 반환합니다.이 매개 변수는 필드 조회에 설명 된 형식이어야합니다.
In : Category.objects.get(id=1)
Out : <Category: Category object (1)>
지정된 필드에 대해 업데이트 쿼리를 수행하고 일치하는 행 수를 반환한다.
(일부 행에 이미 새 값이있는 경우 업데이트 된 행 수와 같지 않을 수 있음).
In : Category.objects.filter(name='탄산').update(name='콜드브루')
Out : 2 #총 업데이트된 row 개수
QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고 삭제 된 개체 수와 개체 유형별 삭제 횟수가 있는 dictionary를 반환합니다.
In : Category.objects.filter(name='qp').delete()
Out : (1, {'products.Category': 1})
한 테이블의 모든 레코드를 가져오려면 아래와 같이 all() method를 사용합니다. 그 결과로 QuerySet 을 반환합니다. 이때, QuerySet 안에는 각각 인스턴스가 포함되어 있습니다.
In : Category.objects.all()
Out : <QuerySet [<Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>, <Category: Category object (7)>]>
In : for category in Category.objects.all()
print(category.name)
#아래와 같이 인스턴스들이 담겨 있는 QuerySet이 반환되기 때문에, 모든 속성에 접근해서 데이터를 관리할 수 있습니다.
Out : 티
브루드커리
브루드커피
콜드브루
콜드브루
한 테이블의 특정 레코드를 가져오려면 필터를 사용할 수 있다. filter() method는 가장 자주 사용하는 필터 기능이다. filter(**kwargs): 키워드 인자로 주어진 lookup 조건에 일치하는 레코드들의 QuerySet을 반환한다.
case1
In : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]
case2
In : Category.objects.filter(name='브루드커피').filter(id=3)
Out : [<Category: Category object (3)>]
case3
In : Category.objects.filter(name='브루드커피').exclude(id=3)
Out : [<Category: Category object (4)>]