AI 웹 개발 과정/파이썬 장고 실무 기초

07. 4주차 이론 -

만 기 2022. 5. 31. 03:39

 

데이터베이스 관계

 

1. one-to-many

 

  • 작성자와 게시글의 관계. 한명의 작성자는 여러 게시글을 가질 수 있다. 하지만 반대의 경우는 성립 안된다.

 

2. one-to-one

 

  • 한 사용자당 하나의 프로필의 관계. '데이터 A'와 '데이터 B'가 서로 만나서 중복이 되지 않는 값을 만들어 내는 것

 

3. many-to-many

 

  • A모델과 B모델이 있을 때 A가 여러 개의 B를 가질 수도 있고 B가 여러 개의 A를 가질 수도 있을 때

 

 

 

 

many-to-many 연습을 위한 앱 생성

 

1. 터미널 django-admin startapp restaurant

 

2. settings.py 파일의 INSTALLED_APP 에 생성된 앱 추가

 

 

 

 

many-to-many 모델 등록하기

 

1. restaurant/models.py

# restaurant/models.py
from django.db import models


# Create your models here.

class MyTopping(models.Model):
    class Meta:
        db_table = "my_topping"

    def __str__(self):
        return self.topping_name

    topping_name = models.CharField(max_length=100)


class MyPizza(models.Model):
    class Meta:
        db_table = "my_pizza"

    def __str__(self):
        return self.pizza_name

    pizza_name = models.CharField(max_length=100)
    pizza_topping = models.ManyToManyField(MyTopping)

 

2. 모델 데이터베이스에 적용시키기

 

  •     python manage.py makemigrations
        python manage.py migrate

 

3. admin 페이지에 추가 (admin.py)

from django.contrib import admin
from .models import MyPizza,MyTopping

# Register your models here.

admin.site.register(MyPizza)
admin.site.register(MyTopping)

 

4. admin 계정 생성하고 admin에서 확인

 

  • python manage.py createsuperuser

 

** 저장 오류가 나는 경우 : django 가 createsuperuser 를 잘 인식하지 못함.

=> 데이터베이스 초기화 : 우측 데이터베이스 remove, 좌측 db.sqlite3 delete, 좌측 migration 폴더에서 __init__ 제외하고 모두삭제.

=> 다 지웠으면 migrations 부터 다시 실행하고 superuser 계정 다시만들기

 

 

 

 

django shell 로 many-to-many 모델 확인해보기

 

* django shell : Django를 실행하지 않고도 기능들을 사용 할 수 있도록 도와주는 도구

 

1. 실행 : python manage.py shell

 

2. 피자 모델에서 토핑 부르기

>>> from restaurant.models import MyTopping, MyPizza

#전체 피자
>>> MyPizza.objects.all()
<QuerySet [<MyPizza: 도미노>, <MyPizza: 피자헛>, <MyPizza: 파파존스>]>

# 피자를 하나씩 불러볼게요
>>> MyPizza.objects.get(pizza_name='도미노')
<MyPizza: 도미노>

# 각 피자의 토핑들을 불러볼게요
>>> MyPizza.objects.get(pizza_name='도미노').pizza_topping.all()
<QuerySet [<MyTopping: 치즈>, <MyTopping: 치킨>]>
  • pizza_name 은 models.py 에서 값 들어간 변수 이름

 

3. 토핑 모델에서 토핑 가진 피자 부르기

>>> from restaurant.models import MyTopping, MyPizza

#전체 토핑
>>> MyTopping.objects.all()
<QuerySet [<MyTopping: 치즈>, <MyTopping: 페퍼로니>, <MyTopping: 올리브>, <MyTopping: 치킨>, <MyTopping: 피망>]>

#각 토핑별로 출력
>>> MyTopping.objects.get(topping_name='치즈')
<MyTopping: 치즈>

# 각 토핑이 들어있는 피자를 불러오기
>>> MyTopping.objects.get(topping_name='치즈').mypizza_set.all()
<QuerySet [<MyPizza: 도미노>, <MyPizza: 피자헛>, <MyPizza: 파파존스>]>
  • Many-To-Many 모델은 '서로의 테이블에서' 서로의 데이터를 불러 올 수 있는 것이 특징