class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=200, unique=True, allow_unicode=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return f'/blog/tag/{self.slug}/'
제목: Jeongyeon Happy Coding
글 번호: 3
Slug Example: www.xxx.com/3/jeongyeon-happy-coding
class Category(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=200,unique=True,allow_unicode=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return f'/blog/category/{self.slug}/'
class Meta:
verbose_name_plural = 'Categories'
class Post(models.Model):
# 제목
title = models.CharField(max_length=30)
# 부가 설명
hook_text = models.CharField(max_length=100, blank=True)
# 내용
content = MarkdownxField()
# 썸네일
head_image = models.ImageField(upload_to='blog/images/%Y/%m/%d/',blank=True)
# 파일
file_upload = models.FileField(upload_to='blog/files/%Y/%m/%d/', blank=True)
# 작성 시각
created_at = models.DateTimeField(auto_now_add=True)
# 수정 시각
updated_at = models.DateTimeField(auto_now=True)
# 작성자
author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
# 카테고리
category = models.ForeignKey(Category, null=True, blank=True ,on_delete=models.SET_NULL)
# 태그
tags = models.ManyToManyField(Tag,blank=True)
# 출력
def __str__(self):
return f'[{self.pk}]{self.title} :: {self.author}'
# URL
def get_absolute_url(self):
return f'/blog/{self.pk}/'
# 파일 이름
def get_file_name(self):
return os.path.basename(self.file_upload.name)
# 파일 확장자
def get_file_ext(self):
return self.get_file_name().split('.')[-1]
# 마크다운 문법 적용
def get_content_markdown(self):
return markdown(self.content)
# 작성자 아바타
def get_avatar_url(self):
if self.author.socialaccount_set.exists():
return self.author.socialaccount_set.first().get_avatar_url()
else:
return f'https://doitdjango.com/avatar/id/1294/177331d29d6f0c20/svg/{self.author.email}'
Category: 라이프스타일, 여행, 공부
Post: 글1,글2,글3,글4,글5
User: 유저1, 유저2, 유저3
글1: 라이프스타일, 유저2
글2: 여행, 유저2
글3: 공부, 유저1
글4: 라이프스타일, 유저3
글5: 여행, 유저1
3개의 카테고리와 5개의 포스트가 있다고 가정하자.
포스트를 기준으로 했을 때, 각 포스트는 1개의 카테고리만 설정할 수 있다.
하지만 카테고리는 여러 개의 포스트를 포함할 수 있다.
이러한 관계를 다대일 관계라고 정의한다.
유저와 포스트의 관계도 마찬가지이다.
Tag: 장고, 파이썬, 프라이탁
Post: 글1, 글2, 글3
글1: 장고, 프라이탁
글2: 파이썬, 프라이탁, 장고
글3: 장고
반면에 다대다 관계에서는 1개의 포스트가 여러 개의 태그를 포함할 수 있다.
동시에 1개의 태그도 여러 개의 포스트를 포함할 수 있다.
class Comment(models.Model):
post = models.ForeignKey(Post,on_delete=models.CASCADE)
author = models.ForeignKey(User,on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f'{self.author}::{self.content}'
def get_absolute_url(self):
return f'{self.post.get_absolute_url()}#comment-{self.pk}'
def get_avatar_url(self):
if self.author.socialaccount_set.exists():
return self.author.socialaccount_set.first().get_avatar_url()
else:
return f'https://doitdjango.com/avatar/id/1294/177331d29d6f0c20/svg/{self.author.email}'