[REAL Python – Django] – “Django – comment model 구현”
[REAL Python – Django] – “Django – comment model 구현”
4월 2, 2022
models.py
작성
대댓글은 나중에 구현할 것이지만, 댓글은 기본적으로 연결되어있는 게시물이 있어야 합니다.
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}'
댓글 모델은 위와 같은 구조를 가집니다. 포스트와 연결되어 있어야 하고, 저자와 연결되어 있어야 하므로 외래 키로 연결해주었습니다.
템플릿 작성
{# single comment #}
{% if post.comment_set.exists %}
{% for comment in post.comment_set.iterator %}
<div class="d-flex" id="comment-{{ comment.pk }}">
<div class="flex-shrink-0">
<img class="mr-3" src="https://dummyimage.com/60x60/ced4da/6c757d.jpg" alt="..."/>
</div>
<div class="ms-3">
<h5 class="mt-0">
{{ comment.author.username }}
<small class="text-muted">
{{ comment.created_at }}
</small>
</h5>
<p>{{ comment.content | linebreaks }}</p>
</div>
</div>
{% endfor %}
{% endif %}
{# single comment #}
다른 것은 다 이해가 되었는데 2줄의 post.comment_set
이라는 키워드는 처음 들어보는 것이라 그것에 대해 찾아보기로 했습니다.
https://stackoverflow.com/questions/42080864/set-in-django-for-a-queryset 에서 답을 찾을 수 있었습니다.
class Car(models.Model):
pass
class Wheel(models.Model):
car = models.ForeignKey(Car, on_delete=models.CASCADE)
>>> w.car # returns the related Car object to w
>>> c.wheel_set.all() # returns all Wheel objects related to c
예컨대 위와 같은 코드가 있다고 했을 때에 Car
와 Wheel
은 외래 키 관계로 연결되어 있습니다. Car
이 부모 테이블, Wheel
이 자식 테이블이 되겠네요.
w
가Wheel
의 객체이고,c
가Car
의 객체라고 가정하겠습니다. 그 경우w.car
와 같은 코드는w
와 연결된 모든car
객체를 반환하게 됩니다.c.wheel_set.all()
와 같은 코드는c
와 관련된 모든Wheel
객체를 반환합니다.
위의 정보를 토대로 post.comment_set
의 뜻은 post
와 관련된 comment
들을 의미하는 것입니다. 그것이 존재할 때에만 쿼리문을 날리도록 코드가 작성된 것이네요.