Django_C.R.U.D

DonQ·2020년 12월 30일
0

TIL

목록 보기
14/31
post-thumbnail

Django_C.R.U.D

jango web framework를 활용한 application 개발에 핵심이되는 URLconf, View, Model 중에 Model을 작성하고 ORM을 통해서 Database에 table을 만들고 데이터를 생성, 조회, 수정, 삭제하는 방법을 블로그에 정리 예정

Database 생성

$ mysql.server start

$ mysql -u root -p

mysql> create database "NAME" character set utf8mb4 collate utf8mb4_general_ci;

Settings.py 설정

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',
        'USER': 'root',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

models.py 작성

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 Field

DECIMAL(5,2) : 전체 5자리중에서 소숫점 2자리까지 확보되었다 라는 의미이다.
max_digits : 숫자에 허용되는 최대 자릿수이다.
decimal_places : 숫자와 함께 저장하는 소수 자릿수의 개수이다.

Methods QuerySets

create()

Table에 데이터를 추가(INSERT) 해주는 method로, 생성된 인스턴스를 반환해준다.

In  : Category.objects.create(name='콜드브루')
Out : <Category: Category object (1)>

get()

지정된 조회 매개 변수와 일치하는 인스턴스를 반환합니다.이 매개 변수는 필드 조회에 설명 된 형식이어야합니다.

In  : Category.objects.get(id=1)
Out : <Category: Category object (1)>

update()

지정된 필드에 대해 업데이트 쿼리를 수행하고 일치하는 행 수를 반환한다.
(일부 행에 이미 새 값이있는 경우 업데이트 된 행 수와 같지 않을 수 있음).

In  : Category.objects.filter(name='탄산').update(name='콜드브루')
Out : 2 #총 업데이트된 row 개수

delete()

QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고 삭제 된 개체 수와 개체 유형별 삭제 횟수가 있는 dictionary를 반환합니다.

In  : Category.objects.filter(name='qp').delete()
Out : (1, {'products.Category': 1})

all()

한 테이블의 모든 레코드를 가져오려면 아래와 같이 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() & exclude()

한 테이블의 특정 레코드를 가져오려면 필터를 사용할 수 있다. 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)>]
profile
꾸준히 쌓아가는 코딩 Study

0개의 댓글