【问题标题】:How to return last comment?如何返回最后的评论?
【发布时间】:2021-12-29 20:43:05
【问题描述】:

我可能有一个小问题。即当我使用'post.cmets.all'时如何提取最后一条评论

class CommentPost(models.Model):
      user = models.ForeignKey(Profil, on_delete=models.CASCADE)
      post = models.ForeignKey(Posty, on_delete=models.CASCADE, related_name="comments")
      content1 = models.TextField(max_length=250, blank=False, null=False)
      date_posted = models.DateTimeField(default=timezone.now)
      date_updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return str(self.content1)


class Posty(models.Model):
   title = models.CharField(max_length=250, blank=False, null=False, unique=True)
   sub_title = models.SlugField(max_length=250, blank=False, null=False, unique=True)
   content = models.TextField(max_length=250, blank=False, null=False)
   image = models.ImageField(default="avatar.png",upload_to="images", validators=[FileExtensionValidator(['png','jpg','jpeg'])])
   author = models.ForeignKey(Profil, on_delete=models.CASCADE)
   updated = models.DateTimeField(auto_now=True)
   published = models.DateTimeField(auto_now_add=True)
   T_or_F = models.BooleanField(default=False)
   likes = models.ManyToManyField(Profil, related_name='liked')
   unlikes = models.ManyToManyField(Profil, related_name='unlikes')
   created_tags = models.ForeignKey('Tags', blank=True, null=True, related_name='tagi', on_delete=models.CASCADE)

观看次数

    tag = request.GET.get('tag')
if tag == None:
    my_tag = Posty.objects.all
    print(my_tag)
else:
    my_tag = Posty.objects.filter(created_tags__tag=tag)
    print(my_tag)

如果我尝试使用 '[:1]' 或最后,这不起作用。

【问题讨论】:

  • 最后一个帖子是什么意思?你似乎已经有了Post,因为你使用了post.comments.all()
  • 哦,我的错,我的意思是最后一条评论。

标签: python django templates


【解决方案1】:

您可以通过以下方式获取最后一条评论:

post.comments<strong>.latest('date_posted')</strong>

或者如果您想要date_updated 的最新信息,请使用:

post.comments<strong>.latest('date_updated')</strong>

如果您想获取每个帖子的最后一条评论,您可以使用Prefetch 对象:

from django.db.models import OuterRef, Subquery

posts = Posty.objects.annotate(
    latest_comment=Subquery(
        CommentPost.objects.filter(
            post=OuterRef('pk')
        ).values('content1').order_by('-date_posted')[:1]
    )
)

然后在模板中,您可以使用:

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

【讨论】:

  • 无法解析余数:'('date_posted')' from 'post.cmets.latest('date_posted')'
  • @ProtoN:你不能在模板中使用它。您应该在视图中执行此操作。 Django 模板故意限制语法,使得方法调用(带参数)是不允许允许的。
  • 我知道,但是当我尝试查看时。我也遇到了错误;3 'ReverseManyToOneDescriptor' 对象没有属性 'latest'
  • @ProtoN:看起来post 不是Post 对象,而是对Post 类的引用。
  • 所以我无法返回最后一条评论?没门?如果我尝试 {% for com in post.cmets.all %} 它返回所有 cmets。 {% for post in my_tag %}
    {% for com in post.cmets.all %} {{com.content1}} {% endfor %}
    {% endfor %}
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多