모델은 모든 타입의, 임의 숫자 필드를 가질 수 있음
각각의 필드는 데이터베이스 테이블에 저장할 데이터 column을 나타냄
필드타입
필드 옵션
관계형 필드
모델을 설계하는데 매우 중요한 개념.
on_delete (필드 간의 관계에서 삭제에 대한 옵션)
ForeignKey
class Post(models.Model):
pass
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
OneToOneField
class User(AbstractBaseUser):
pass
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
ManyToManyField
class Post(models.Model):
pass
class Article(models.Model):
pass
class Tag(models.Model):
name = models.CharField(max_length=100, unique=True)
post_set = models.ManyToManyField('Post', blank=True)
article_set = models.ManyToManyField('Article', blank=True)
reverse_name
ex)
my_field_name = models.CharField(max_length=20, help_text='Enter field documentation', primary_key=True)
class Product(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
메타 데이터는 다른 데이터에 대한 정보를 제공하는 특정 데이터 집합
메타 클래스는 권한, 데이터베이스 이름, 단/복수 이름, 추상화, 순서 등과 같이 모델에 대한 사항을 정의하는데 사용(선택사항)
메타 데이터의 가장 유용한 기능 중 하나는 모델 타입을 쿼리할 때 반환되는 기본 레코드 순서를 제어(sorting)
django meta option
주요 메소드가 위치하는 순서
모든 데이터베이스 필드
커스텀 매니저 속성
Meta 클래스
def init() 메소드
def str() 메소드
def save() 메소드
def get_absolute_url() 메소드
기타 커스텀 메소드
class Meta:
db_table = 'data_table'
ordering = ['-my_field_name']
모델은 메소드를 가질 수 있음
최소한 모든 모델마다 표준 파이썬 클래스의 메소드은 str()을 정의하여 각각 object가 사람이 읽을 수 있는 문자열을 반환 하도록 해야함
이 문자열은 관리자 사이트에 잇는 개별적인 레코드들을 보여주는데 사용
ex)
def __str__(self):
return self.field_name
장고는 클래스 기반 뷰를 작성하는 표준화된 방법을 제공
뷰 클래스가 내장 함수를 반환하는 as_view() 클래스 매서드를 제공
django.views.generic.View에서 해당 매커니즘이 구현되며 모든 클래스 기반 뷰는 이클래스를 직간접적으로 상속 받음
클래스 기반 뷰를 이용할 때 가이드 라인
믹스인
실체화된 클래스가 아니라 상속해 줄 기능들을 제공하는 클래스
프로그래밍에서 다중 상속을 해야할 때 믹스인을 쓰면 클래스에 더 나은 기능과 역할을 제공할 수 있음
믹스인을 이용하여 뷰 클래스를 작성할 때는 몇 가지 규칙이 있음
django가 제공하는 기본 뷰는 항상 오른쪽
mixin은 기본 뷰 부터 왼쪽
minxin은 파이썬의 기본 객체 타임(object)를 상속
from django.views.generic import TemplateView
# 파이썬 기본 객체 타입인 object를 상속 받고 있음
class FreshFruitMixin(object):
def get_context_data(self, **kwargs):
context = super(FreshFruitMixin, self).get_context_data(**kwargs)
context['has_fresh_fruit'] = True
return context
# Minin과 View를 동시에 상속받고 있음
class FruityFlavorView(FreshFruitMixin, TemplateView):
template_name = "fruity_flavor.html"
제네릭 클래스 기반 뷰 종류
제네릭 뷰 오버라이딩
매소드 오버라이딩
def index(request):
if request.method == 'POST':
# POST 요청일경우
else:
# POST 요청이 아닐 경우