#models.py
from django.db import models


# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField('Author')
    publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
    publication_date = models.DateField()

    def __str__(self):
        return self.title


class Author(models.Model):
    name = models.CharField(max_length=50)
    salutation = models.CharField(max_length=500)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Publisher(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    website = models.URLField()

    def __str__(self):
        return self.name

- Book 테이블 생성

컬럼:title, authors, publisher, publication_date

authors는 Book과 Author 테이블이 다대다 관계이므로 ManyToManyField를 사용했고 publisher 컬럼은 Publisher과 Book 테이블이 외래키 관계이기 때문에 ForeignKey를 사용하여 관계를 정의하여 주고 on_delete=model.CASCADE 파라미터를 통해 외래키 관련 레코드가 사라질 경우 해당 외래키와 관련된 레코드들이 지워지는 설정으로 데이터베이스 무결성을 지키기 위함이다.

 

- Author 테이블 생성

컬럼: name, salutation, email

 

- Publisher 테이블 생성

컬럼: name, address, website

 

__str__ 메소드는 admin 페이지에서 해당 레코드가 어떻게 보여질지를 설정할 수 있는 함수이다.

 

- Admin 페이지에 모델 등록하기 및 Admin 페이지 커스텀 하기

from django.contrib import admin
from polls.models import Question, Choice

# Choice 모델을 테이블 형식으로 Inline 생성
# 이것은 Question 모델을 추가할 때 Choice 모델을 같이 보기 위해 사용됨
# extra 2개씩 추가로 보여줌
class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 2


class QuestionAdmin(admin.ModelAdmin):
    # 필드를 분리하여 보여주기
    # 필드를 설명하는 제목, 필드명, 적용할 옵션
    # collapse: 필드내용 Hide/Show 기능 추가
    # fields = ['pub_date', 'question_text'] -> 등록 페이지에서 컬럼 순서 변경
    fieldsets = [
        ('Question Statement', {'fields':['question_text']}),
        ('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),

    ]
    # 같이 볼 모델 클래스
    inlines = [ChoiceInline]
    # admin 페이지에서 보여질 테이블 컬럼
    list_display = ('question_text', 'pub_date')
    # 필터 위젯 추가
    list_filter = ['pub_date']
    # 검색 박스 표시
    search_fields = ['question_text']

# admin 사이트에 모델 등록
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)

- 결과 화면

+ Recent posts