프로그래밍/Python

예제로 Django 웹사이트 구축하기 - 2

챠우 2022. 3. 9. 16:17
728x90

 

이번에는 Database Model을 정의하는 것을 진행하겠습니다.

예제로 도서관을 진행하고 있으므로

모델은 책(Book), 저자(Author), 장르(Genre), 책관리(BookInstance)에 대해서 진행하겠습니다.

진행은 예제 코드에서 각 코드에 대해서 설명하는 것으로 진행하겠습니다.

모델 정의는 catalog/models.py에 정의하면 됩니다.

#reverse함수를 위해서 import
#reverse는 이름으로 url을 되돌려준다.
from django.urls import reverse
#unique id를 위해서 import
import uuid

# 장르 Model 정의
class Genre(models.Model):
    # 장르 Model에 name field 추가
    # 최대 길이는 200
    # help_text는 입력창에 입력을 돕기위해 표시되는 글자
    name = models.CharField(max_length=200, help_text='Enter a book genre (e.g. Science Fiction)')

    # Model의 이름을 제공
    def __str__(self):
        return self.name

# 책 Model 정의
class Book(models.Model):
    # title field 추가
    title = models.CharField(max_length=200)
    # author(저자) field 추가
    # 해당 field는 author model에 foreignkey로 연결된다. 1:N관계이다.
    # author model에서 해당 저자가 삭제되는 경우 해당 field는 Null로 처리된다.
    author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
    # summary field 추가
    # TextField는 CharField보다 긴 글을 입력할 수 있다.
    summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book')
    # ISBN field 추가
    isbn = models.CharField('ISBN', max_length=13, help_text='13 Character ISBN number')
    # Genre(장르) field 추가
    # ManyToManyField는 N:N관계에서 사용된다.
    genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        # urls.py에 book-detail이름을 가진 url로 제공되고 뒤에 ID가 제공됨
        return reverse('book-detail', args=[str(self.id)])

# 책관리 Model 정의
class BookInstance(models.Model):
    # 책 ID field 추가 uuid4는 무작위 uuid생성
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular book across whole library')
    # book field 추가. Book Model과 연결되며 삭제시 Null처리된다.
    book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
    # 출판 field를 추가
    imprint = models.CharField(max_length=200)
    # 반납일 field를 추가
    due_back = models.DateField(null=True, blank=True)

    # 대출상태에 대한 목록 정의
    LOAN_STATUS = (
        ('m', 'Maintenance'),
        ('o', 'On loan'),
        ('a', 'Available'),
        ('r', 'Reserved'),
    )

    # 대출상태 field 추가
    status = models.CharField(
        max_length=1,
        choices=LOAN_STATUS,
        blank=True,
        default='m',
        help_text='Book availability',
    )

    class Meta:
        # 정렬은 반납일 기준으로 정렬
        ordering = ['due_back']

    def __str__(self):
        # format 형태로 return "id (title)" 형식으로 출력됨.
        return f'{self.id} ({self.book.title})'

# 저자 Model 추가
class Author(models.Model):
    # first name field 추가
    first_name = models.CharField(max_length=100)
    # last name field 추가
    last_name = models.CharField(max_length=100)
    # 탄생일 field 추가
    date_of_birth = models.DateField(null=True, blank=True)
    # 사망일 field 추가
    date_of_death = models.DateField('Died', null=True, blank=True)

    class Meta:
        # 정렬은 last name으로 1차 정렬 후 first name으로 정렬됨
        ordering = ['last_name', 'first_name']

    def get_absolute_url(self):
        # urls.py에 author-detail이름을 가진 url로 제공되고 뒤에 ID가 제공됨
        return reverse('author-detail', args=[str(self.id)])

    def __str__(self):
        # format 형태로 return "last name, first name" 형식으로 출력됨.
        return f'{self.last_name}, {self.first_name}'
 

다 정의했으면 Migration해야 합니다.

python3 manage.py makemigrations
python3 manage.py migrate