用子查询集的最大值注释查询集

时间:2020-07-03 15:41:02

标签: django

我有以下几种型号:

Hikes(models.Model)
   name = ...
   difficulty = models.IntegerField

Regions(models.Model)
   hike = models.ManyToManyField(Hikes)

现在,我正在尝试返回一个区域内最困难的加息,但是我需要在返回多个区域的查询集上显示此值。我想最好的方法是用“ hardesthike”字段或诸如此类的注释每个Region,但无法弄清楚代码。我可以使代码适用于单个区域,但不能使其适用于多个区域的查询集。

我对单个区域的代码是:

q = Region.objects.get(id=1)
hikes = q.hike.all().values('difficulty')
max = hikes.aggregate(Max('difficulty'))

如何将这个新值注释到初始区域?最好采用简单的整数形式,以便我可以按“区域中最困难的远足”进行排序。另外,当我尝试使用任何类型的聚合函数在视图中执行任何forloop时,我注意到我的网页速度大大降低(我的数据库中有10k +个区域/远足)–可以通过这种方式解决吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用以下注释:

from django.db.models import Max

Regions.objects.annotate(
    max_hike=Max('hike__difficulty')
)

因此,如果您只对Region中的id=1感兴趣:

from django.db.models import Max

Regions.objects.annotate(
    max_hike=Max('hike__difficulty')
).filter(pk=1)

,或者如果您要检索该Region 对象

from django.db.models import Max

Regions.objects.annotate(
    max_hike=Max('hike__difficulty')
).get(pk=1)

注意:通常,Django模型的名称为单数,因此使用Region代替 Regions