django queryset.first()无法在html上呈现

jk9hmnmh  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(109)

我只是在学习Django,所以任何指导都会非常感激。我正在创建一个应用程序,经过身份验证的用户可以喜欢其他帖子。在其中一个页面上,我想渲染并显示最喜欢的帖子。请看下面的代码:
models.py:

class Enter(models.Model):

    title = models.CharField(
        max_length=200, unique=True, null=False, blank=False)
    slug = models.SlugField(
        max_length=200, unique=True, null=False, blank=False)
    competitor = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='post_enter')
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    featured_image = CloudinaryField('image', null=False, blank=False)
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    likes = models.ManyToManyField(User, related_name='post_likes', blank=True)

    class Meta:
        ordering = ['-created_on']

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Enter, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

    def number_of_likes(self):
        return self.likes.count()

views.py:

class CurrentOrderList(generic.ListView):

    model = Enter
    queryset = Enter.objects.filter(status=1).order_by('likes')[0]
    template_name = 'competition.html'

competition.html:

<div class="container-fluid">
    {% for entry in enter_list %}
    <div class="row justify-content-center mt-4">
        <div class="col-md-4">
            <div class="card mb-4">
                <div class="card-body">
                    <div>
                        <img class="card-img-top" src=" {{ entry.featured_image.url }}">
                        <div>
                            <p class="competitor text-muted">By: {{ entry.competitor }}</p>
                        </div>
                    </div>
                    <h2 class="card-title">{{ entry.title }}</h2>
                    <hr />
                    <p class="card-text text-muted h6">{{ entry.created_on}} <i class="far fa-heart"></i>
                        {{ entry.number_of_likes }}</p>
                </div>
            </div>
        </div>
    </div>
    {% endfor %}
</div>

如果我从www.example.com列表中删除[0](或.first())views.py,页面上确实会呈现,但某些项目会重复-使用.distinct()不会删除重复项
如何显示点赞数最高的条目?谢谢大家!

vyswwuz2

vyswwuz21#

你可能想按喜欢的 * 数量 * 排序,这是按喜欢排序的另一种方式。通过执行.order_by('-likes'),您可以按照 liker 的主键降序排序,因此相同的Enter会出现与likers一样多。
如果你想按喜欢的数量订购,你可以使用:

from django.db.models import Count

class CurrentOrderList(generic.ListView):
    model = Enter
    queryset = (
        Enter.objects.filter(status=1)
        .alias(nlikes=Count('likes'))
        .order_by('-nlikes')
    )
    template_name = 'competition.html'

然而,使用[0].first()没有意义,那么这些不是查询集,而是Enter对象。queryset应该有一个QuerySet类型的值,而不是模型对象。
如果你只想显示最受欢迎的帖子,这是一个DetailView,因此你可以使用get_object

from django.db.models import Count

class CurrentOrderList(generic.DetailView):
    model = Enter
    queryset = (
        Enter.objects.filter(status=1)
        .alias(nlikes=Count('likes'))
        .order_by('-nlikes')
    )
    template_name = 'competition.html'

    def get_object(self, *args, **kwargs):
        return self.get_queryset().first()

然后它将该对象作为object传递给模板,因此您不需要使用{% for … %}来枚举,您只需要呈现object

相关问题