【问题标题】:Rendering highest integer value from three models instances in django在 django 中渲染三个模型实例的最高整数值
【发布时间】:2022-08-04 20:29:37
【问题描述】:

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

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 并将相关模型作为上下文传递以在同一模板上渲染单个模型“ranking”字段。

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

    标签: python django django-models django-queryset django-annotate


    【解决方案1】:

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

    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. 最大限度- 这会找到所提供字段的最大值,我们使用双下划线表示法来访问相关模型的ranking 字段,因为ranking 不是MyModelParent 的字段。

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

    3. 总计的- 我们只需要单个最高数字,并且聚合会将查询集压缩到字典中 - 如果需要,我们可以向其中添加其他值。如果我们希望每个查询集对象都可以访问该值,也可以使用 Annotate。

    【讨论】:

    • 你能解释一下发生了什么吗?
    • 添加了一些解释
    • 感谢 0sVoid,它确实有效,但为列表视图中的每条记录显示相同的最高数字......即,无论哪个记录具有最高值,它都会为每条记录填充。这里有什么解决办法吗?
    • 如果您希望查询集中的每条记录都具有最大值,请使用 annotate 而不是聚合
    猜你喜欢
    • 2022-01-25
    • 2019-10-11
    • 1970-01-01
    • 2021-05-21
    • 2019-12-15
    • 2011-02-26
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多