[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 }}&nbsp;&nbsp;
                                        <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이 자식 테이블이 되겠네요.

  • wWheel의 객체이고, cCar의 객체라고 가정하겠습니다. 그 경우 w.car 와 같은 코드는 w와 연결된 모든 car 객체를 반환하게 됩니다.
  • c.wheel_set.all() 와 같은 코드는 c 와 관련된 모든 Wheel 객체를 반환합니다.

위의 정보를 토대로 post.comment_set 의 뜻은 post와 관련된 comment 들을 의미하는 것입니다. 그것이 존재할 때에만 쿼리문을 날리도록 코드가 작성된 것이네요.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.