Подсчет количества ответов на конкретное сообщение в Django

Я хочу подсчитать количество ответов на определенный пост в Django

View.py

**POST CODE**
def forum(request):
profile = Profile.objects.all()
if request.method=="POST":   
    user = request.user
    image = request.user.profile.image
    content = request.POST.get('content','')
    post = Post(user1=user, post_content=content, image=image)
    post.save()
    messages.success(request, f'Your Question has been posted successfully!!')
    return redirect('/forum')
posts = Post.objects.filter().order_by('-timestamp')
return render(request, "forum.html", {'posts':posts})

КОД ОТВЕТА

def discussion(request, myid):
post = Post.objects.filter(id=myid).first()
replies = Replie.objects.filter(post=post)
if request.method=="POST":
    user = request.user
    image = request.user.profile.image
    desc = request.POST.get('desc','')
    post_id =request.POST.get('post_id','')
    reply = Replie(user = user, reply_content = desc, post=post, image=image)
    reply.save()
    messages.success(request, f'Your Reply has been posted successfully!!')
    return redirect('/forum')
return render(request, "discussion.html", {'post':post, 'replies':replies})    

model.py

class Post(models.Model):
user1 = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
post_id = models.AutoField
post_content = models.CharField(max_length=5000)
timestamp= models.DateTimeField(default=now)
image = models.ImageField(upload_to="images",default="")
def __str__(self):
   return f'{self.user1} Post'

class Replie(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
reply_id = models.AutoField
reply_content = models.CharField(max_length=5000) 
post = models.ForeignKey(Post, on_delete=models.CASCADE, default='')
timestamp= models.DateTimeField(default=now)
image = models.ImageField(upload_to="images",default="")
def __str__(self):
   return f'{self.user1} Post'

Я хочу сделать как this. где на месте Number of reply, я хочу отобразить количество ответов конкретного поста

пожалуйста, помогите мне разобраться

Для архивации можно использовать связанное имя модели Post (посмотрите документацию ). Django создаст поле для каждого внешнего ключа, которое позволит вам получить доступ к связанной модели. По умолчанию оно будет называться replie_set в модели Post.

Затем это поле можно использовать для получения количества ответов на сообщение, вызвав метод count() из набора запросов replie_set. Я бы также добавил метод в модель Post, который делает это для удобства.

Чтобы свести все это вместе, ваша модель Post будет выглядеть следующим образом:

class Post(models.Model):
    user1 = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    post_id = models.AutoField
    post_content = models.CharField(max_length=5000)
    timestamp= models.DateTimeField(default=now)
    image = models.ImageField(upload_to="images",default="")
    
    def count_replies():
        return self.replies_set.count()

    def __str__(self):
       return f'{self.user1} Post'

Предположим, что ваш шаблон forum.html итерирует посты следующим образом:

{% for post in posts %}
    ...
{% endfor %}

Вы получаете количество ответов, вызывая post.count_replies(). Конечно, если вы не хотите добавлять специальный метод в модель, вы можете просто использовать do post.replie_set.count() напрямую.

@Eega предложил правильный ответ просто некоторые изменения в коде помогут вам

class Post(models.Model):
    user1 = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    post_id = models.AutoField
    post_content = models.CharField(max_length=5000)
    timestamp= models.DateTimeField(default=now)
    image = models.ImageField(upload_to="images",default="")
    
    @property
    def count_replies(self):
        return self.replies_set.count()

    def __str__(self):
       return f'{self.user1} Post'

post = Post.objects.filter(id=myid).first() до post = Post.objects.filter(id=myid).first().prefetch_related('replies_set') Это сделает ваш запрос оптимизированным Также примите только ответ @Eega, я только что показал вам отредактированный код

Вернуться на верх