【问题标题】:Displaying a sorted list with ManyToMany relation显示具有多对多关系的排序列表
【发布时间】:2014-01-08 22:51:30
【问题描述】:

我有一定数量的对象和用户。用户可以为一个或多个主题投票。我想制作一个视图,以降序显示按票数排序的前 10 个主题。

事实上,我找到了一种可行的方法,但我在问自己是否有更合适的方法来做到这一点。

我从模型开始:

class Subject(models.Model):
    text = models.TextField()

class User(models.Model):
    name = models.CharField(max_length=64)
    subject = models.ManyToManyField(Subject)

现在我可以打字了:

Subject.user_set.all()

我会得到那些为该主题投票的用户。

现在我想制作一个列表视图,其中将显示按投票数排序的前 10 个主题。 所以我在Subject类中添加了一个类方法:

class Subject(models.Model):
    text = models.TextField()

    @staticmethod
    def by_votes():
        myList = list(Subject.objects.all())
        return sorted(myList, key=lambda s: s.user_set.count(), reverse=True)[:10]

并定义了基于类的视图:

class SubjectListView(ListView):
    model = Subject
    template_name = "subject_list.html"
    context_object_name = "subject_list"
    queryset = Subject.by_votes()

实际上效果很好。 但是我在文档 Manager 和 QuerySet 类中看到了,不幸的是我不太了解如何使用它们(定义自定义类)来获得我正在寻找的东西(不处理原始 SQL 查询)。

我有点害怕,因为我使用的列表可能会遇到大量主题的记忆问题。 你会说什么,使用自定义 Manager oder QuerySet 会更合适,不是吗? 如果是,怎么做?

还有其他的想法吗?

谢谢! 彼得

【问题讨论】:

    标签: django view model relation sorted


    【解决方案1】:

    这里不需要自定义管理器或原始 SQL,只需聚合。

    from django.db.models import Count
    Subject.objects.annotate(user_count=Count('user').order_by('-user_count')[:10]
    

    【讨论】:

      【解决方案2】:

      我对此很陌生,但我解决了一个类似的问题:

      Subject.objects.all().annotate(count=Count('user')).order_by('-count')[:10]
      

      Aggregation Doc

      【讨论】:

        猜你喜欢
        • 2021-04-27
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多