Django ORM 聚合传递模型方法值
Django ORM pass model method value in aggregate
这是我的模型:
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
方法值:
user_wise = User.objects.filter(
id=request.user.id
).aggregate(
get_total=Sum('user_bill__get_total')
)
在我的例子中,我必须查询从 user
到 related_name
的所有内容,这就是我在这里聚合模型方法的原因。
任何人都可以帮助我如何在聚合中传递这个 get_total
方法?
我不想就这样过去。 Bill.objects.get(user__id=request.user.id).get_total
任何人都可以帮助实现这个目标吗?
感谢您的帮助
你可以简单地这样做:
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')
)
此外,由于 User
和 Bill
之间是 OneToOne 关系,因此您不需要像这样复杂的解决方案。您可以简单地使用:
user_wise = request.user.user_bill.get_total()
这是我的模型:
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
方法值:
user_wise = User.objects.filter(
id=request.user.id
).aggregate(
get_total=Sum('user_bill__get_total')
)
在我的例子中,我必须查询从 user
到 related_name
的所有内容,这就是我在这里聚合模型方法的原因。
任何人都可以帮助我如何在聚合中传递这个 get_total
方法?
我不想就这样过去。 Bill.objects.get(user__id=request.user.id).get_total
任何人都可以帮助实现这个目标吗?
感谢您的帮助
你可以简单地这样做:
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')
)
此外,由于 User
和 Bill
之间是 OneToOne 关系,因此您不需要像这样复杂的解决方案。您可以简单地使用:
user_wise = request.user.user_bill.get_total()