Do It Django Model Review

이정연·2022년 10월 5일
0

Django

목록 보기
9/12

🏷 Tag

CODE

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}/'
  • name/slug 필드 생성
  • slug를 이용하여 URL 설정

Slug

  • Slug란? 이미 얻은 데이터를 통하여 URL 주소를 생성해주는 방법

    제목: Jeongyeon Happy Coding
    글 번호: 3

Slug Example: www.xxx.com/3/jeongyeon-happy-coding


🖇 Category

CODE

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'
  • Category 복수형 표기가 올바르지 않아 직접 설정

📄 Post

CODE

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}'

다대일 관계 vs 다대다 관계

다대일 관계

Category: 라이프스타일, 여행, 공부
Post: 글1,글2,글3,글4,글5
User: 유저1, 유저2, 유저3

글1: 라이프스타일, 유저2
글2: 여행, 유저2
글3: 공부, 유저1
글4: 라이프스타일, 유저3
글5: 여행, 유저1

3개의 카테고리와 5개의 포스트가 있다고 가정하자.

포스트를 기준으로 했을 때, 각 포스트는 1개의 카테고리만 설정할 수 있다.

하지만 카테고리는 여러 개의 포스트를 포함할 수 있다.

이러한 관계를 다대일 관계라고 정의한다.

유저와 포스트의 관계도 마찬가지이다.

  • 다대일 관계에서는 ForeignKey를 활용

다대다 관계

Tag: 장고, 파이썬, 프라이탁
Post: 글1, 글2, 글3

글1: 장고, 프라이탁
글2: 파이썬, 프라이탁, 장고
글3: 장고

반면에 다대다 관계에서는 1개의 포스트가 여러 개의 태그를 포함할 수 있다.

동시에 1개의 태그도 여러 개의 포스트를 포함할 수 있다.

  • 다대다 관계에서는 ManyToManyField를 활용

💬 Comment

CODE

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}'

on_delete=models.CASCADE

  • 필드가 사라지면 레코드도 함께 삭제
profile
0x68656C6C6F21

0개의 댓글