【问题标题】:Using django and django-voting app, how can I order a queryset according to the votes of each item?使用 django 和 django-voting 应用程序,如何根据每个项目的投票来订购查询集?
【发布时间】:2010-05-17 11:57:54
【问题描述】:

(我是 python 和 django 的新手,所以请耐心等待。如果这已在其他地方得到回答但找不到,我深表歉意)

假设我有一个链接模型,并且通过 django-voting 应用程序用户可以对链接实例进行投票。我如何根据它们的分数对这些链接实例进行排序,例如。首先显示那些得分较高的。

我假设我可以使用 django-voting 的 get_top 管理器,但这只会给我得分最高的链接实例,并且不会考虑我想添加的其他参数(例如,那些属于特定用户或寻呼或其他)。

我的猜测是为我的 Link 模型编写一个自定义管理器,我可以在其中根据每个项目的分数过滤查询集。如果我理解正确,这将需要我遍历每个项目,检查其分数,然后将其放入一个列表(或字典),然后根据每个项目的分数对其进行排序。这不会返回一个查询集,而是一个包含每个项目的字典。

我错过了什么吗?

编辑:

这是 Link 模型的精简版:

class Link(models.Model):
    user = models.ForeignKey('auth.User')
    category = models.ForeignKey(Category)  
    date = models.DateTimeField( auto_now_add=True, null=True, blank=True )
    is_deleted = models.BooleanField(default=False, blank=True)
    links = ValidLinkManager()
    objects = models.Manager()

当用户投票时,我认为:

Vote.objects.record_vote(link, user, vote)

其中 link 是 Link 实例,user 是 auth.User 的实例,并且 vote 是 1、0 或 -1。 ValidLinkManager 只是过滤掉那些 is_deleted 设置为 True 的链接。

【问题讨论】:

  • 您能否发布一些代码,可能是您的链接模型的样子...?
  • 我不太确定你想在这里做什么。你只是想命令显示选票吗?
  • 不,我想根据每个项目的得分/投票来订购一个链接查询集。目标是首先显示得分最高的项目。

标签: django sql-order-by django-voting


【解决方案1】:

VoteManager 中的get_top 方法并不复杂。查看它的代码(在managers.py:122 中)。您可以轻松地创建一个版本,该版本接受一个过滤器作为另一个参数,并在创建它后将其应用于“对象”查询集,在第 158 行 - 这样您就可以添加其他过滤器,例如您缺少的过滤器。

也许您也可以将它作为补丁提供给 jonathan,他会将其放入 django-voting 中:)

【讨论】:

    【解决方案2】:

    我选择在我的模型中使用通用关系:

    votes = generic.GenericRelation(Vote)
    

    然后聚合它:

    my_model.objects.annotate(num_votes=Count('votes'))
    

    在这种情况下,我只是计算对象收到的票数,但您可以将CountAvg 切换以获得平均值。

    由于this does not work with Django by default,我安装了django-generic-aggregation

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2016-04-24
      • 2018-01-05
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多