呈现django中三个模型实例的最高整数值



我有三个模型,它们都与一个模型相关。

class MyModelParent(models.Model):
name = models.CharField(max_lenght=36, blank=True)
def __str__(self):
return self.name or ""
class MyFirstModel(models.Model):
mymodelparent = models.ForeignKey(MyModelParent, related_name="first_models", blank=True, Null=True, on_delete=models.CASCADE
ranking = models.IntegerField(max_lenght=36, blank=True)
def __str__(self):
return self.name or ""
class MySecondModel(models.Model):
mymodelparent = models.ForeignKey(MyModelParent, related_name="second_models", blank=True, Null=True, on_delete=models.CASCADE
ranking = models.IntegerField(max_lenght=36, blank=True)
def __str__(self):
return self.name or ""
class MyThirdModel(models.Model):
mymodelparent = models.ForeignKey(MyModelParent, related_name="third_models", blank=True, Null=True, on_delete=models.CASCADE
ranking = models.IntegerField(max_lenght=36, blank=True)
def __str__(self):
return self.ranking or ""

我在DetailView(CBV(中呈现MyParentModel,并将相关模型作为上下文传递,以在同一模板上呈现各个模型的"排名"字段。

现在我需要在MyParentModel ListView上呈现相同的"ranking",但我只想显示具有最高值的"ranging"。问题是,我如何比较我的相关模型"排名整数值",并在MyParentModel ListView页面上显示最高值?

您可以使用Greatest比较不同字段,并使用Max()比较字段本身的值-聚合将返回单个最大值:

from django.db.models import Max
from django.db.models.functions import Greatest
MyModelParent.objects.aggregate(
max=Greatest(
Max('first_models__ranking'),
Max('second_models__ranking'),
Max('third_models__ranking'),
)
)
# output: {'max': 230}

编辑-解释

此查询有三个部分:

  1. Max-这会找到所提供字段的最大值,我们使用双下划线表示法来访问相关模型的ranking字段,因为ranking不是MyModelParent的字段。

  2. 最伟大-因为Max只适用于字段,我们不能用它来找到最大值的最大值(如果有意义的话(。相反,我们需要使用Greatest,它是一个DB函数(而Max位于django.db.models中(,并从所述列表中返回最大值。因此,我们为它提供了来自三个不同模型的每个Max值。

  3. Aggregate-我们只需要一个最高的数字,聚合会将查询集压缩到字典中-如果需要,我们可以向其中添加其他值。如果我们希望每个查询集对象都能访问这个值,也可以使用注释。

最新更新