【问题标题】:Can i sort query set return objects in order to function result我可以对查询集返回对象进行排序以便处理结果吗
【发布时间】:2015-08-17 11:46:01
【问题描述】:

我正在编写一个基于网络的音乐应用程序,我想实现一些功能,用户可以在上周-月-年中看到最喜欢的专辑。 所以这是我的模型:

class album(models.Model):
   def get_weely_count():
      ...
   def get_monthly_count():
      ...

   def get_yearly_count():
      ...

class like(models.Model):
   created_at = models.DateField()
   albumID = models.ForeignKey(Album)

现在我想收到上周或上个月或去年最喜欢的专辑,我想做这样的事情(但我做不到):

Album.objects.all().order_by('get_weekly_count')

谁能帮我解决它或提供另一种方法来实现该目标?

【问题讨论】:

  • 你目前的结果是什么?什么是预期的?
  • order_by 应用于数据库级别,这就是为什么您不能将它与常规 python 函数一起使用。

标签: django django-models django-queryset


【解决方案1】:

order_by 方法转换为 SQL ORDER BY,因此它仅适用于对应于表列的模型字段。如果您打算通过模型的方法对元素进行排序,它将不起作用。 所以,如果你想完成类似的事情

Album.objects.all().order_by('get_weekly_count')

你必须用python的方式来做

sorted(Album.objects.all(), key=lambda x: x.get_weekly_count())

就性能而言,这意味着您将通过查询获取元素,然后使用 python 对它们进行排序(这与一次性获取排序的查询集不同)。 否则,如果您可以将 get_weekly_count 转换为原始 SQL,则可以将其与 Count()extra 修饰符一起使用,这将使 order_by 可用,即:

Album.objects.all().extra(
    select={'weekly_count': "<some SQL>"},
    select_params=(<you params>,),
).order_by('weekly_count')

看看https://docs.djangoproject.com/en/1.8/ref/models/querysets/#extra

【讨论】:

    【解决方案2】:

    根据文档,您应该使用:

    from django.db.models import Count
    like.objects.filter(created_at__gt=START_OF_MONTH, created_at__lt=Datetime.now()).values('albumID').annotate(count=Count('albumID')).order_by('count')
    

    这将在单个数据库查询中为您提供结果。更多详情请访问https://docs.djangoproject.com/en/dev/topics/db/aggregation/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多