TIL no.29 Django C.R.U.D

백선호·2021년 7월 17일
0

TIL

목록 보기
26/39
post-thumbnail

Model 을 작성하고 ORM을 통해서 Database에 Table을 만들고 데이터를 생성, 조회, 수정, 삭제하는 해볼 것이다. ORM 이란 영어로 Object-Relation Mapping, 객체(Object)와 관계형 데이터베이스(Relational)을 연결(Mapping) 해 주는 것을 의미한다. 즉 데이터베이스의 테이블을 객체(Object)와 연결하여 테이블에 CRUD를 할 때, SQL 쿼리를 사용하지 않고도, 가능하게 하는 것을 말한다.

Model 작성

-당연히 django에서 프로젝트를 생성하고 생성된 프로젝트 안에 에플리케이션을 만들어져 있어야 한다.

-models.py 에는 Model Class 작성을 통해 database 의 table과
mapping하는 코드를 작성할것이다.

-AQuery Tool을 참조하여 해당하는 table을 만들건데, AQuery Tool에는 스타벅스 홈페이지의 커피메뉴를 기반으로 만들것이다.

from django.db import models
from django.db.models.fields import TextField

# Create your models here.
class Menu(models.Model):
    name = models.CharField(max_length=45)
    class Meta:
        db_table ='menu'
    def __str__(self):
        return self.name

class Category(models.Model):
    name = models.CharField(max_length=45)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
    class Meta:
        db_table ='categories'
    def __str__(self):
        return self.name, self.menu

class Product(models.Model):
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    korean_name = models.CharField(max_length=45)
    english_name = models.CharField(max_length=45)
    fordescription = models.TextField()
    nutrition = models.ForeignKey('Nutrition', on_delete=models.CASCADE)
    class Meta:
        db_table ='products'
    def __str__(self):
        return self.korean_name, self.english_name

class Images(models.Model):
    image_url= models.CharField(max_length=2000)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    class Meta:
        db_table ='images'
    def __str__(self):
        return self.image_url

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)
    saturated_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)
    size_ml=models.CharField(max_length=45)
    size_fluid_ounce=models.CharField(max_length=45)
    class Meta:
        db_table ='nutritions'
    def __str__(self):
        return self.size_ml, self.size_fluid_ounce

class Allergy(models.Model):
    name = models.CharField(max_length=45)
    class Meta:
        db_table ='allergy'
    def __str__(self):
        return self.name


class AllergyProduct(models.Model):
    allergy = models.ForeignKey('Allergy',  on_delete=models.CASCADE)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    class Meta:
        db_table ='allergy_products'
    def __str__(self):
        return self.name
  • class를 작성할 때 python에서는 class 명을 항상 대문자로 표시한다.
  • class에 상속을 받아올 건데 python 문법으로 models.Model를 상속받아 온다.
  • class 안에 table 안에 해당하는 column을 생성할 건데 AQuery Tool을 해당하는 테이블명을 확인한 후에 작성한다. 예를 들어 categories 테이블에 name이라는 column이 있다. name의 datatype은 VARCHAR(45)이다. djanogo에는 field type으로 datatype을 지정해 줄 수 있는데 이때 사용되어야 하는 것은 CharField이다. CharField(max_legth=45)로 진행해 주면 된다.
  • 테이블의 이름을 지정해 줘야 하는데 class Meta를 사용한다. 꼭 db 테이블을 명시해 줘야 한다.
    -foreign key(외래 키)를 지정할 때는, 참조 받는 column 명 = models.ForeignKey('참조 받는 테이블명', on_delete=CASCASE)으로 작성해야 한다. on_delete 속성은 delete 시 참조 관계 속 모든 데이터를 삭제한다.
  • str() 메서드는 객체의 표현을 대화식 프롬프트에서 편하게 보기 위해서다.

models.py DB에 적용

  • makemigrations: models.py에 작성한 python code를 database에 적용하기 위한 migration 파일(설계도)를 만드는 과정
    $python manage.py makemigrations app이름
  • migrate : makemigration으로 생성한 migration 파일(설계도)을 database에 적용

    ```
    $python manage.py migrate
    ```



    잘 적용이 되었다면, 사진처럼 migration을 확인할 수 있을 것이고, mysql을 실행해서 해당하는 use database db 명; 입력 후 show tables;를 입력하면 생성이 잘 됐는지 확인이 가능하다. 만약 테이블의 구조를 보고 싶다면 desc 테이블명 으로 확인이 가능하다.

QuerySet

생성된 테이블에서의 CREATE, READ, UPDATE, DELETE를 진행한다. 시작 전 터미널에 shell을 실행한루 작성한 모델 클래스 import 한다.

1. Create



만약 foreign key(외래 키)를 작성해야 한다면, 참조하는 테이블_ id=1 이런 식으로 작성한다.

2. Read


get 메서드를 사용해서 읽어올 수는 있지만 한 개의 데이터 밖에 불러올 수 없다 따라서 만약 여러 가지 데이터를 읽어오고 싶을 때는 filter 메서드를 사용하면 된다.

3. Update

4. Delete

profile
baik9261@gmail.com

0개의 댓글