TIL no.29 Django C.R.U.D
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
Author And Source
이 문제에 관하여(TIL no.29 Django C.R.U.D), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@baik9261/TIL-no.29-Django-C.R.U.D저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)