【问题标题】:Django ORM pass model method value in aggregateDjango ORM 传递模型方法值聚合
【发布时间】:2020-05-08 04:18:30
【问题描述】:

这是我的模型:

class Bill(models.Model):
    user =  models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='user_bill'
    )
    flat_rent = models.DecimalField(
        max_digits=6,
        decimal_places=2,
        default=0.00
    )
    gas_bill = models.DecimalField(
        max_digits=6,
        decimal_places=2,
        default=0.00
    )

    # Also i have many such decimalField here that calculated in get_total
    ===========================================


    def get_total(self):
        total = self.flat_rent + self.gas_bill
        return total

我试图在这里传递这个get_total mehtod 值:

user_wise = User.objects.filter(
            id=request.user.id
        ).aggregate(
            get_total=Sum('user_bill__get_total')
        )

就我而言,我必须从userrelated_name 查询所有内容,这就是我在这里聚合模型方法的原因。

谁能帮助我如何在聚合中传递这个get_total 方法?

我不想这样通过。 Bill.objects.get(user__id=request.user.id).get_total

任何人都可以帮助实现这一目标吗?

感谢您的帮助

【问题讨论】:

    标签: django django-models django-queryset django-orm


    【解决方案1】:

    你可以这样做:

    from django.db.models import F, Sum
    
    user_wise = Bill.objects.filter(
            user=request.user
        ).annotate(
            get_total=F('flat_rent') + F('gas_bill')
        ).aggregate(
            total=Sum('get_total')
        )
    

    另外,由于它是UserBill 之间的OneToOne 关系,因此您不需要像这样复杂的解决方案。您可以简单地使用:

    user_wise = request.user.user_bill.get_total()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2011-08-22
      • 2019-01-12
      • 1970-01-01
      • 2011-09-02
      • 2018-08-19
      • 2010-11-25
      • 2016-07-23
      相关资源
      最近更新 更多