Model ์์ฑํ๊ธฐ
1. views.py์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ํ๋๋ฅผ ์ด๋ป๊ฒ ํ ์ง ์๊ฐํด๋ณธ๋ค.
2. models.py ์์ฑ
๋ชจ๋ ๋ชจ๋ธ์ ํด๋์ค๋ก ์์ฑ๋๊ณ , ์ฅ๊ณ ์์ ์ ๊ณตํ๋ model์ ๋ฐ์์์ผํ๋ค.
from pydoc import describe
from django.db import models
class Menu(models.Model): # ์์
name = models.CharField(max_length=50) # charfield๋ ์ ์ฅํ ์ต๋๊ธธ์ด๊ฐ ํ์์ธ์
description = models.CharField(max_length=100)
price = models.IntegerField()
img_path = models.CharField(max_length=255)
def __str__(self):
return self.name
model field ์ ๋ฆฌ
ํ๋(Field)
ํ๋(Field)๋ ๋ฐ์ดํฐ ํ ์ด๋ธ์์์ ์ด(column), ์ฆ ๋ฐ์ดํฐ์ ์์ฑ์ ์๋ฏธํฉ๋๋ค.
CharField
class CharField(max_length=None)
์ ํ๋ ๊ธธ์ด์ ๋ฌธ์์ด์ ์ํ ํ๋์ ๋๋ค.
- max_length ํ์ ์ธ์์ด๋ฉฐ ์ ๋ ฅํ ์ต๋ ๊ธธ์ด๋ฅผ ์ค์ ํฉ๋๋ค.
IntegerField
class IntegerField()
์ ์ ๊ฐ์ ์ํ ํ๋์ด๋ฉฐ -2147483648 ๋ถํฐ 2147483647 ๋ฒ์๋ฅผ ์ง์ํฉ๋๋ค.
BooleanField
class BooleanField()
Boolean ๊ฐ์ ์ํ ํ๋ ์ ๋๋ค.
DateField
class DateField(auto_now=False, auto_now_add=False)
DateField๋ ํ์ด์ฌ์ datetime.date ๊ฐ์ฒด ํํ๋ก ํ์๋๋ ๋ ์ง ํ๋์ ๋๋ค.
- auto_now true๋ก ์ค์ ๋๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ(save) ๋ ๋๋ง๋ค ์๋์ผ๋ก ํ๋ ๊ฐ์ ์ง๊ธ์ผ๋ก ์์ ํฉ๋๋ค. '๋ง์ง๋ง ์์ ์๊ฐ' ๊ฐ์ ํญ๋ชฉ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ข๊ฒ ์ฃ ?
- auto_now_add ๋ชจ๋ธ์ด ์ฒ์ ์์ฑ๋ ๋ ํ ๋ฒ, ์๋์ผ๋ก ํ๋ ๊ฐ์ ์ง๊ธ์ผ๋ก ์ค์ ํฉ๋๋ค. '์์ฑ๋ ์๊ฐ'์ ์ ์ฅํ๊ธฐ ์ํด ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
DateTimeField
class DateTimeField(auto_now=False, auto_now_add=False)
ํ์ด์ฌ์ datetime.datetime ๊ฐ์ฒด ํํ๋ก ํ์๋๋ ๋ ์ง ํ๋ ์ ๋๋ค. DateField์ ์ธ์ ์ต์ ์ ๊ฐ์ต๋๋ค.
EmailField
class EmailField(max_length=254)
CharField์ ํ์ ํด๋์ค๋ก ๋ฌธ์์ด์ด ์ด์ฉ ๊ฐ๋ฅํ ์ด๋ฉ์ผ ์ฃผ์์ธ์ง EmailValidator๋ฅผ ํตํด ํ์ธํฉ๋๋ค. EmailValidator์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์. (https://docs.djangoproject.com/en/3.1/ref/validators/#django.core.validators.EmailValidator)
FileField
class FileField(upload_to=None, max_length=100)
ํ์ผ ์ ๋ก๋๋ฅผ ์ํ ํ๋ ์ ๋๋ค.
- upload_to ์ ๋ก๋๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ํ๋๋ก Storage.save() ํจ์๋ก ๊ฐ์ด ์ ๋ฌ๋์ด ์ ์ฅ๋ฉ๋๋ค. Storage.save ํจ์ ๊ณต์๋ฌธ์ (https://docs.djangoproject.com/en/3.1/ref/files/storage/#django.core.files.storage.Storage.save)
ImageField
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)
FileField๋ฅผ ์์ํ์ฌ ๊ตฌํ๋๋ ํ์ผ ์ ๋ก๋๋ฅผ ์ํ ํ๋์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ ๊ธธ์ด๊ฐ 100์ธ ๋ฌธ์์ด ํ์์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์์์ ๋์๋ FileField์์ ์ ๋ก๋๋ ํ์ผ์ด ์ ์์ ์ธ ์ด๋ฏธ์ง ํ์ผ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋ ํ๋๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํ Pillow ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์์ ์ผ๋ก ํ์ํฉ๋๋ค. ์ด ๋ถ๋ถ์ ๋ค์์ ํจ๊ป ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- height_field & width_field ๊ฐ์ฒด๊ฐ ์ ์ฅ ๋ ๋ ์ด๋ฏธ์ง์ ๋์ด์ ๋๋น๊ฐ์ด ์๋์ผ๋ก ์ฑ์ ์ง๋๋ค.
์ด ๋ฐ์๋ IP ์ฃผ์๋ฅผ ์ฒดํฌ๋ฅผ ํ๋ GenericIPAddressField, JSON ํ์ผ์ ์ํ JSONField (django 3.1 ๋ฒ์ ์ด์๋ถํฐ ์ง์) ํน์ ํด๋์ ํ์ผ ํจ์ค๋ฅผ ํํํ๋ FilePathField, URL์ ์ํ URLField ๋ฑ ๋ค์ํ ํ๋๊ฐ ์์ต๋๋ค. ๋ค์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์. ( https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default )
์ต์ (Option)
์๋ ์ต์ ์ ๋ชจ๋ ํ๋ ํ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ ํ์ ์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
null
Field.null
๊ธฐ๋ณธ ๊ฐ์ False์ด๋ฉฐ Null ๊ฐ ํ์ฉ ์ฌ๋ถ๋ฅผ ์ ํ ํฉ๋๋ค.
๋ง์ฝ ์ด null ์ต์ ์ ์ ์ฉํ ํ๋๊ฐ ๋ฌธ์์ด ๊ธฐ๋ฐ ํ๋ (Char, Text)์ผ ๊ฒฝ์ฐ์๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ' ' (๋น ๋ฌธ์์ด)๊ณผ Null ๋ชจ๋ ํด๋น ํ๋์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฐ์ ํ๋์ฌ์ผ ํ๋ฏ๋ก Django๋ ๋ฌธ์์ด ๊ธฐ๋ฐ ํ๋๊ฐ ๋ฐ์ดํฐ๊ฐ ์์์ ํ์ํ ๋๋ ' '(๋น ๋ฌธ์์ด)์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
blank
Field.blank
๊ธฐ๋ณธ ๊ฐ์ False์ด๋ฉฐ True๋ก ์ค์ ํ ๊ฒฝ์ฐ ํ๋ ๊ฐ์ ๋น ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด null๊ณผ blank์ ์ฐจ์ด๋ ๋ฌด์ ์ผ๊น์? null์ ์จ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ์ฌํญ์ด๊ณ blank๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ์ ๊ด๋ จ๋ ์ต์ ์ ๋๋ค. ์๋ฅผ๋ค์ด blank๊ฐ True๋ผ๋ฉด ํด๋น ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ง ์์๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๊ฒ ๋ฉ๋๋ค.
default
Field.default
ํ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ์ต์ ์ผ๋ก ๊ฐ ๋๋ ํจ์๊ฐ ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
db_column
Field.db_column
ํด๋น ํ๋์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ๋ช ์ ์ง์ ํฉ๋๋ค. ๋ฐ๋ก ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.
๋ ๋ง์ ํ๋์ ์ต์ ์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด ์๋ django ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์. https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default
3. ๋ชจ๋ธ์ด ์์ฑ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ฉด ์ฅ๊ณ ํํ ์๋ ค์ค์ผํ๋ค.
python manage.py makemigrations # migrations ๋ง๋ค๊ธฐ
python manage.py migrate # migrations ์ ์ฉ์ํค๊ธฐ
python manage.py showmigrations # ํ์ฌ ์์ฑ๋์ด ์๋ migration ๋ชฉ๋ก๋ณด๊ธฐ [X] ๋ฐ์๋๊ฒ
python manage.py sqlmigrate ์ฑ์ด๋ฆ ๋ง์ด๊ทธ๋ ์ด์
๋ฒํธ # migration์ด orm์ ํตํด์ ์ด๋ป๊ฒ sql๋ก ๋ณํ๋์๋์ง ํ์ธ
shell ์ด์ฉํด์ ๋ฐ์ดํฐ ์์ฑ, ์กฐํ, ์์ , ์ญ์ ํ๊ธฐ
1) shell ์คํ
python manage.py shell
2) ์ฑ ์์ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
# foods ์ฑ ์์ models์์ Menu ๋ชจ๋ธ์ ๋ถ๋ฌ์ค๊ธฐ
from foods.models import Menu
3) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
# {model๋ช
}.objects.create({ํ๋๋ช
}={๊ฐ})
Menu.objects.create(name="์ฝ๋ฉ์ ๋น ์ง ๋ญ",
... description="์ฃผ๋จธ๋๊ฐ ๊ฐ๋ฒผ์ด ๋น์ ์ ๋ง์๊น์ง ์๊ฐํ ๊ฐ๊ฒฉ",
... price = 10000,
... img_path = "foods/images/chicken.jpg")
# <Menu:์ฝ๋ฉ์ ๋น ์ง ๋ญ>
4) ๋ฐ์ดํฐ ์กฐํํ๊ธฐ
# ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํํ๊ธฐ
Menu.objects.all()
#<QuerySet [<Menu: ์ฝ๋ฉ์ ๋น ์ง ๋ญ>]>
# ์ธ๋ถ ๋ฐ์ดํฐ๊น์ง ์กฐํํ๊ธฐ
Menu.objects.all().values()
"""
<QuerySet [{'id': 1, 'name': '์ฝ๋ฉ์ ๋น ์ง ๋ญ', 'description': '์ฃผ๋จธ๋๊ฐ ๊ฐ๋ฒผ์ด ๋น์ ์ ๋ง์๊น
์ง ์๊ฐํ ๊ฐ๊ฒฉ', 'price': 10000, 'img_path': 'foods/images/chicken.jpg'}, {'id': 2, 'name': '๋๋ ๋ด๊ฒ ๋น ๋๋', 'description': '๋ฐ๋๋ ์๋ฐ๋๋ ๋ฐ๋๋', 'price': 2000, 'img_path': 'foods/images/banana.jpg'}, {'id': 3, 'name': '์ฝ๋ฐ๋ฆฌ์', 'description': '์ฐธ๊นจ๋นต ์์ ์์ ๊ณ ๊ธฐ ํจํฐ
์ธ์ฅ', 'price': 8000, 'img_path': 'foods/images/burger.jpg'}]>
"""
# ์กฐํํ๊ณ ์ถ์ ํ๋๋ง ์กฐํํ๊ธฐ
Menu.objects.all().values('price')
# <QuerySet [{'price':10000},{'price':2000},{'price':8000}]>
# ๊ฐ๊ฒฉ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ ์กฐํํ๊ธฐ
Menu.objects.order_by('price')
# ์์ ์ด๋ฆ ์ค์ ์ฝ ๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด๊ฐ ๋ชจ๋ ์์ ์กฐํ
Menu.objects.filter(name__contains="์ฝ")
# <QuerySet [<Menu: ์ฝ๋ฉ์ ๋น ์ง ๋ญ>, <Menu: ์ฝ๋ฐ๋ฆฌ์>]>
# 2000์ ๋ถํฐ 10000์ ์ฌ์ด์ ์์ ์กฐํ
Menu.objects.filter(price__range(2000,10000))
5) ๋ฐ์ดํฐ ์์
>>> data = Menu.objects.get(id=1) # id=1๋ฒ์งธ๋ฅผ data์ ์ ์ฅ
>>> data # data ์ถ๋ ฅ
<Menu: ์ฝ๋ฉ์ ๋น ์ง ๋ญ>
>>> data.name = "์ฝ๋น ๋ญ" # ๋ณ๊ฒฝ
>>> data
<Menu: ์ฝ๋น ๋ญ>
>>> data.save() # ์ ์ฅ
>>> Menu.objects.all()
<QuerySet [<Menu: ์ฝ๋น ๋ญ>, <Menu: ๋๋ ๋ด๊ฒ ๋น ๋๋>, <Menu: ์ฝ๋ฐ๋ฆฌ์>]>
6) ๋ฐ์ดํฐ ์ญ์
>>> data = Menu.objects.get(id=3) # id=3๋ฒ์งธ ๊ฐ์ data์ ๋ฃ๊ณ
>>> data
<Menu: ์ฝ๋ฐ๋ฆฌ์>
>>> data.delete() # ์ญ์
(1, {'foods.Menu': 1})
>>> Menu.objects.all()
<QuerySet [<Menu: ์ฝ๋น ๋ญ>, <Menu: ๋๋ ๋ด๊ฒ ๋น ๋๋>]>
>>>
7) ์ข ๋ฃ
exit()
Model ์ ์ฉํ๊ธฐ
ํ๋์ฝ๋ฉ : ์์ค ์ฝ๋ ์์ ๋ฐ์ดํฐ๊ฐ ์ง์ ์ ๋ ฅ๋์ด ์๋ ์ฝ๋ฉ ํํ, ๋ฐ์ดํฐ ์ ์ค ์ํ & ์ ์ง๋ณด์ ์ด๋ ค์
ํ๋์ฝ๋ฉ์ ๋ฐ๊ฟ์ฃผ์
index ํ ํ๋ฆฟ์ ์๋ ํ๋์ฝ๋ฉ์ view์์ ๋ชจ๋ ๋๊ฒจ์ฃผ๋๋ก ๋ง๋ค๊ณ index ๋ทฐ๋ ๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ค๋๋ก ํ์
1. foods/views.py
index์์ ๋ชจ๋ ๋ฉ๋ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๊ฐ์ ธ์ค์
def index(request):
context = dict()
today = datetime.today().date()
menus = Menu.objects.all()
context["date"] = today
context["menus"] = menus
return render(request, 'foods/index.html', context=context)
2. index.html ์์
{% for menu in menus %}
{% endfor %} ์ฌ์ฉํ์
{% for menu in menus %}
<div class="food">
<img src={% get_static_prefix %}{{menu.img_path}} width="300px" height="200px" />
<div class="info">
<h3>{{menu.name}}</h3>
<P>{{menu.description}}</p>
<a href="#">๋ฉ๋ด ๋ณด๊ธฐ</a>
</div>
</div>
{% endfor %}
'๐๐ช > Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
1์ฃผ์ฐจ 5๋ฒ์งธ (Kaggle ์ฌ์ฉ๋ฒ, ๊ด๊ณ ๋ฐ์ดํฐ ์์ธกํ๊ธฐ) (0) | 2022.10.10 |
---|---|
Admin (0) | 2022.09.27 |
django ์๋ฌํ์ด์ง (0) | 2022.09.27 |
๋์ ์นํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.09.26 |
์ ์ ๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ (0) | 2022.09.26 |
๋๊ธ