๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“๐Ÿ’ช/Django

4์ฃผ์ฐจ_1๋ฒˆ์งธ_๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๊ณ„, Many -to - Many ๋ชจ๋ธ ๋“ฑ๋ก

by ์ˆ˜์จ”์•™ 2022. 9. 24.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜

1. one - to - many

 

ํ•œ๊ฐœ์˜ ๊ธ€์— ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑ์„ ํ•  ์ˆ˜ ์—†๊ณ ,

ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ด€๊ณ„๊ฐ€ one-to-many ๋‹ค!

 

class UserModel(AbstractUser):
    class Meta:
        db_table = "my_user"

    bio = models.TextField(max_length=500, blank=True)


class TweetModel(models.Model):
    class Meta:
        db_table = "tweet"

    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class TweetComment(models.Model):
    class Meta:
        db_table = "comment"
    tweet = models.ForeignKey(TweetModel, on_delete=models.CASCADE)
    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    comment = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

์ „์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ์ค‘ ForeignKey๋ฅผ ๋ณด๋ฉด one-to-many์ธ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

2. one - to - one

 

class UserModel(AbstractUser):
		...(์ƒ๋žต)

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_pk = models.IntegerField(blank=True)
    nickname = models.CharField(max_length=200, blank=True)
    point = models.IntegerField(default=0)
    phone = models.CharField(max_length=200, blank=True)

 

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด UserModel์€ AbstractUser์˜ ๊ธฐ๋Šฅ์„ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— username, email,, ๋“ฑ๋“ฑ ๋งŽ๋‹ค!

 

Profile ํด๋ž˜์Šค๋Š” User๋ชจ๋ธ์„ ํ•˜๋‚˜์˜ ์ •๋ณด๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์•ˆ์— OneToOneField ๋ผ๋Š” ๊ฒƒ์€ ์ด ์œ ์ €๋ชจ๋ธ๊ณผ ํ”„๋กœํ•„์ด ์ผ๋Œ€์ผ๋กœ ๋งค์นญ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ๋‹น ํ”„๋กœํ•„์€ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค!

 

 

3. many - to - many

 

A๋ชจ๋ธ๊ณผ B๋ชจ๋ธ์ด ์žˆ์„ ๋•Œ A๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ B๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ณ  B๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ A๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒฝ์šฐ!

 

class MyTopping(models.Model):
    topping_name = models.CharField(max_length=100)

class MyPizza(models.Model):
    pizza_name = models.CharField(max_length=100)
    pizza_topping = models.ManyToManyField(MyTopping)

 

ํ”ผ์ž๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ† ํ•‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ 

์˜ฌ๋ฆฌ๋ธŒ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”ผ์ž์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค! ์ด๋Ÿฐ ๊ด€๊ณ„์ด๋‹ค!

 

 


 

์—ฐ์Šต ์•ฑ ์ƒ์„ฑํ•˜๊ธฐ

 

1. ์•ฑ ๋งŒ๋“ค๊ธฐ

ํ„ฐ๋ฏธ๋„ ์ฐฝ์— 

django-admin startapp restaurant ์ž…๋ ฅํ•˜๋ฉด ์ขŒ์ธก ํƒ์ƒ‰๊ธฐ์— ํด๋” ์ƒ๊ธด๋‹ค

 

2. ํ…Œ์ŠคํŠธ ์•ฑ ์—ฐ๊ฒฐ (์žฅ๊ณ ํ•œํ…Œ ์•Œ๋ ค์ฃผ๊ธฐ)

myspartasns์˜ settings.py์—

INSTALLED_APPS์— 'restaurant', ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ

 

 

 


 

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. db์— ์ ์šฉ์‹œ์ผœ์ฃผ์ž

python manage.py makemigrations
python manage.py migrate

 

 

 

3. admin์— ๋“ฑ๋กํ•˜๊ธฐ

 

restaurant/admin.py์— ์•„๋ž˜ ์ฝ”๋“œ ์ž…๋ ฅ

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

# Register your models here.

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

 

 

4. ๊ด€๋ฆฌ์ž๊ณ„์ • ๋งŒ๋“ค๊ธฐ 

 

admin์— ๋กœ๊ทธ์ธํ•  ๊ด€๋ฆฌ์ž๊ณ„์ •์„ ๋งŒ๋“ค์–ด์ฃผ์ž

python manage.py createsuperuser

์ฐจ๋ก€๋Œ€๋กœ username, email, password, password(again) ์ž…๋ ฅํ•ด์ฃผ๊ณ  ์ƒ์„ฑํ•œ๋‹ค!

 

 

5. http://127.0.0.1:8000/admin/    ๋กœ ์ ‘์†ํ•˜๊ธฐ

 

์ƒ์„ฑํ•œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด

 

์š” ํ™”๋ฉด์ด ์•„์ฃผ ์ž˜ ๋‚˜์˜จ๋‹ค

 

ํ† ํ•‘์— ์น˜์ฆˆ๋ฅผ ์ถ”๊ฐ€์‹œํ‚ค๊ณ ์ž My toppings๋ฅผ ๋ˆ„๋ฅด๊ณ  ์น˜์ฆˆ ์ถ”๊ฐ€ ํ–ˆ๋”๋‹ˆ

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€...... ์ผ๋‹จ ์„œ๋ฒ„ ์ข…๋ฃŒํ•˜๊ณ 

 

์œ ์ €๋ชจ๋ธ ํ…Œ์ด๋ธ”์„ ์ง€๊ธˆ ๋งŒ๋“  ๋ชจ๋ธ๋กœ ๋ฐ”๊พธ๋ฉด์„œ ๊ด€๋ฆฌ์ž์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์ด ์ œ๋Œ€๋กœ ์„ธํŒ…์ด ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ!(์œ ์ €๊ถŒํ•œ์ด ์ž˜๋ชป๋˜์–ด์„œ)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ๋œ๊ฑธ ์‹น ์ง€์šฐ๊ณ  ๋‹ค์‹œ ํ•ด์ฃผ์ž

db.sqlite3 ์‚ญ์ œ

restaurant/migrations, user/migrations, tweet/migrations  ์•ˆ์— __init__.py ๋นผ๊ณ  ๋‚˜๋จธ์ง€ (0001, 0002 ์ด๋Ÿฐ๊ฑฐ) ์‹น ์‚ญ์ œ 

 

์•„๋ž˜ ์ฝ”๋“œ ํ„ฐ๋ฏธ๋„์— ํ•œ ์ค„์”ฉ์ž…๋ ฅํ•ด์„œ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์ฃผ์ž

python manage.py makemigrations
python manage.py migrate

python manage.py createsuperuser

 

์„œ๋ฒ„๋ฅผ ๋Œ๋ ค์ฃผ๊ณ 

http://127.0.0.1:8000/admin

์—ฌ๊ธฐ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋‹ค์‹œ admin ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ด์ฃผ๊ณ 

ํ† ํ•‘ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž˜ ๋“ค์–ด๊ฐ€์žˆ๋‹ค!

 

db์—๋„ ์•„์ฃผ ์ž˜ ๋“ค์–ด๊ฐ€์žˆ๋‹ค

 

 

 

728x90

๋Œ“๊ธ€