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

标签 django django-models django-queryset

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

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方法转换为 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

关于django - 我可以对查询集返回对象进行排序以便对结果进行排序吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049556/

相关文章:

django - 如何 "reset"postgresql数据库?

python - 在 django 中检索 imageField 的 url 的最佳方法

python - 注册用户个人资料的正确方法是什么?

Django - order_by() 字符和数字

python - Django 根据值从查询集中获取不同的结果

django - 如何安装 Django-nonrel (Django 1.9)?

python - Eclipse 中的 Django,布置项目

Django 。如何减少每次使用后的优惠券总数

python - Django:如何在不使用默认管理员的情况下管理组和权限

python - Django 查询集注释字段为列表/查询集