DEV/🟢 DJANGO

[DJANGO] CRUD

개발을 하게 되. 2021. 8. 20. 00:44

 

ORM 

장고와 데이터 베이스 언어가 다른데 이를 연결하는 하는 것은 ORM

여기서 CRUD 를 쓸 것이다 . 정확한 ORM뜻은 여기서

 

우선 구조부터 생각하고 들어가자. 

westarbucks 라는 장고 프레임 워크에 여기에는 표시를 안했지만 products 라는 앱을 설치를 하고

이 앱 안에 models.py 그안에 데이터 틀을 만든 상황이다. 이러한 데이터 틀안에는 

메뉴, 카테고리, 상품 데이터 틀을 생성했다. 

 

‣ 메뉴의 속성에는 name, 데이터형태는 글자수 20자이내로 설정 
카테고리의 속성에는 name, 데이터형태는 글자수 20자이내로 설정,
                                  menu, ForeignKey로 menu로 설정했다  => 실제표시는 menu_id 

‣ 상품의 속성에는 name, 데이터형태는 글자수 20자이내로 설정

 

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = 'menus' #테이블 이름을 만듦

class Category(models.Model):
    name = models.CharField(max_length=20)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

    class Meta:
        db_table = 'categories'

class Product(models.Model):
    name = models.CharField(max_length=20)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
메뉴 테이블
id name
카테고리 테이블 
id  name menu_id
상품 테이블
id name category_id

(menu_id, category_id 는 내가 지정하는 것이 아니라 FK 지정시 자동을 생성된다.) 

 

이제 이렇게 설정된 models.py 를 데이터 베이스와 연결시켜야한다. 이때  2단계를 거쳐 데이터베이스와 연결하게 된다. 

1. 데이터베이스에 넣을 설계도 작성 
python manage.py makemigrations 
2. 데이터베이스에 연결 확정
python manage.py migrate 

드디어 장고어플리케이션 "westarbucks" 와  데이터베이스 "westarbucks" 가 연결되었다. 

 

이제 파이썬 셀을 통해 데이터를 생성,조회,수정,삭제 의 과정을 연습해보자 

python manage.py shell

영어로 줄여서 CRUD 라고 표현한다. Create, Read, Upadte, Delete 

이때 가장 중요한 것은 "데이터의 반환값이 무엇인지" 가 핵심이다. 

products 앱에 있는 모델 속 데이터 틀인 Product를 가져와 데이터를 넣어보자, 

 

1. Menu 테이블 지정 

from products.models import Menu

 

2. 테이블에 값 직접넣기 

Menu.objects.create(name='음료')

 

3. 조회하기

: get 과 filter

🔥 get 반환값 : 퀘리셋이 아닌 퀘리셋 안에 있는 id가 1 인 객체를 가져온다.

                    무조건 한개만 가져올 수 밖에 없다. 즉, 값이 하나인것만 가져올 수 있음 

🔥 filter 반환값 : 쿼리셋 조건값에 맞는 행을 가져오기 때문에 여러개 값을 가져올 수 있다. 

 

4. 확인하기 

테이블 확인하기 메뉴이름을 'menus' 로 지정했음

select * from menus

 

5. 상품테이블에 값 넣기 

#Product 테이블 선택 
from products.models import Product

#Product 테이블 값 생성 create
Product.obejects.create(name='우유', category='음료')

카테고리에서 에러가 뜬다. 에러내용을 보면

상품테이블에서 category에 해당하는 값은 FK로 카테고리값과 연결시키고 있기 때문에 그대로 글자가 들어가면 안되고 객체가 들어가야한다. 객체가 들어가야하니 get 메소드를  사용하자. 

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

이러한 객체값을 저장하자. FK로 category를 걸었다고 생각하자. 

category = Category.obejects.get(id=1)

이제 상품 테이블에 값을 넣어보면,

여기서 category_id 는 단순히 Integer 값이 아니라 FK 임이 중요하다 

 

westarbuck project - product app