데이터모델링
이라고 한다.ORM
이라고 한다.Model.py
가 ORM기능을 제공한다.1. 서비스의 요구사항에 맞게 데이터를 모델에 정리하고(데이터 모델링을 하고),,
2. 아래와 같은 python code를 작성하면, django는 아! 이러한 형식으로 데이터를 저장하는 구나! 하고 django가 인식하여 자동으로 그에 맞는 SQL코드를 수행 및 데이터베이스에 저장.
3. 아래와 같은 python code를 작성하면 그에 맞는 SQL코드를 생성한 다음, 실행해서 원하는 데이터를 데이터베이스로부터 읽어온다.
views.py
를 보면 음식이름/설명/가격/이미지경로가 있다. 그렇다면 음식이름/설명/이미지경로는 문자열 형식으로 지정하고, 가격은 숫자형으로 지정하면 될 것 같다. ### views.py
def food_detail(request, food):
context = dict()
if food == 'chicken':
context['name'] = '코딩에 빠진 닭'
context['description'] = '주머니가 가벼운 당신의 마음까지 생각한 가격!'
context['price'] = 10000
context['img_path'] = 'foods/images/chicken.jpg'
else:
raise Http404('이런 음식은 없다구요!')
return render(request, 'foods/detail.html', context)
models.Model
을 써주었는데 이유는 부모클래스로 부터 상속을 받아서 구현해야하기 때문이다.models
는 장고에서 제공하는 클래스이다. 점(.) 연산자를 통하여 내부에 접근한다.### models.py
from django.db import models
# Create your models here.
class Menu(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=100)
price = models.IntegerField()
img_path = models.CharField(max_length=255)
def __str__(self):
return self.name
장고에서 제공하는 필드는 여러 종류가 있는데, 이는 part. VI 를 참고.
python manage.py makemigrations
python manage.py migrate
migration에 대해서는 나중에 다루겠다.
class CharField(max_length=None)
max_length
는 필수 인수이며 입력할 최대 길이를 설정class IntegerField()
class BooleanField()
class DateField(auto_now=False, auto_now_add=False)
auto_now
: true로 설정되면 해당 객체가 변경(save) 될 때마다 자동으로 필드 값을 지금으로 수정함. '마지막 수정 시간' 같은 항목으로 사용하면 좋다.auto_now_add
: 모델이 처음 생성될 때 한 번, 자동으로 필드 값을 지금으로 설정. '생성된 시간'을 저장하기 위해 많이 사용class DateTimeField(auto_now=False, auto_now_add=False)
class EmailField(max_length=254)
class FileField(upload_to=None, max_length=100)
upload_to
: 업로드될 경로를 지정하는 필드로 Storage.save() 함수로 값이 전달되어 저장class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)
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 )
Field.null
만약에, 이 null 옵션을 적용할 필드가 문자열 기반 필드 (Char, Text) 일 경우에는 주의해서 사용해야 하는데 ' ' (빈 문자열)과 Null 모두 해당 필드의 데이터가 없다는 것을 의미하기 때문이다. 일반적으로 데이터가 없다는 것을 의미하는 값은 하나여야 하므로 Django는 문자열 기반 필드가 데이터가 없음을 표시할 때는 ' '(빈 문자열)을 사용하도록 권장하고 있다.
Field.blank
그렇다면 null과 blank의 차이는 무엇일까?
null은 온전히 데이터베이스와 관련된 사항이고 blank는 데이터의 유효성 검사와 관련된 옵션이다. 예를들어 blank가 True라면 해당 필드에 데이터를 입력하지 않아도 유효성 검사를 통과하게 된다.
Field.default
Field.db_column
더 많은 필드와 옵션에 대해 알고 싶다면 아래 django 공식 문서를 참고.
https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.Field.default