我可以对查询集 return 对象进行排序以便运行结果吗
Can i sort query set return objects in order to function result
我正在编写一个基于 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')
任何人都可以帮助我修复它或提供另一种方法来实现该目标吗??
根据文档,您应该使用:
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/.
order_by
方法转换为 SQL ORDER BY
,因此它仅适用于对应于 table 列的模型字段。如果您打算通过模型的方法对元素进行排序,它将不起作用。
所以,如果你想完成类似
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
我正在编写一个基于 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')
任何人都可以帮助我修复它或提供另一种方法来实现该目标吗??
根据文档,您应该使用:
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/.
order_by
方法转换为 SQL ORDER BY
,因此它仅适用于对应于 table 列的模型字段。如果您打算通过模型的方法对元素进行排序,它将不起作用。
所以,如果你想完成类似
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