我可以对查询集返回对象进行排序以便运行结果

时间:2015-08-17 11:46:01

标签: django django-models django-queryset

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

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')

任何人都可以帮我修复它或者用另一种方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

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') 可用,即:

BeanUtils.copyProperties(dest, orig);

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

答案 1 :(得分: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/

相关问题