게시물은 항상 작성자가 존재한다.
어떤 사용자가 어떤 게시글을 작성했는지를 나타내는 사용자와 게시물 간의 관계를 생성해보자.
쟝고는 사용자 계정을 처리하는 인증 프레임워크를 함께 제공한다.
쟝고의 인증 프레임워크는 django.contrib.auth 패키지로 제공되며 User 모델을 포함하고 있다.
쟝고 인증 프레임워크의 User 모델을 사용해 사용자와 게시물 간의 관계를 생성해보자.
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class Post(models.Model):
class Status(models.TextChoices):
DRAFT = 'DF', 'Draft'
PUBLISHED = 'PB', 'Published'
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(
max_length=2, choices=Status.choices, default=Status.DRAFT)
class Meta:
ordering = ['-publish']
indexes = [
models.Index(fields=['-publish']),
]
def __str__(self):
return self.title
django.contrib.auth.models 모듈에서 User 모델을 가져와 Post 모델에 author 필드를 추가했다.
이 필드는 다대일 관계를 정의하며 쟝고는 관련 모델의 기본 키를 사용해 데이터베이스에 외래 키를 생성한다.
on_delete 매개 변수는 참조된 객체가 삭제될 때 선택할 수 있는 동작을 지정하는데,
CASCADE를 사용해 참조된 사용자가 삭제될 때 데이터베이스가 모든 관련 블로그 게시글도 삭제하도록 했다.
related_name을 사용해 User에서 Post로의 역방향 관계를 지정했다.
이렇게 하면 user.blog_posts 표기법을 사용해 User 객체에서 관련 객체에 쉽게 접근할 수 있다.