首页 > 解决方案 > 在对象中添加 .annotate 外键不会给出明显的结果

问题描述

当我运行以下查询时,它工作正常

    query= UserOrder.objects.filter(order_date__range=(
        Request['from'], Request['to'])).values('user_id__username','user_id__email').annotate(
            total_no_of_order=Count("pk")).annotate(total=Sum('total_cost'))

但我也想知道与订单相关的服务数量

.annotate(total_no_of_services=Count("userorderservice__pk"))

通过在查询中添加上述代码total_no_of_ordertotal_cost进行更改,并distinct=Truetotal_cost 考虑单个唯一total_cost

模型.py

class UserOrder(models.Model):
    order_id = models.AutoField(primary_key=True)
    user_id = models.ForeignKey(AppUser, on_delete=models.CASCADE)
    total_cost = models.FloatField()
    ...


class UserOrderService(models.Model):
    order_id = models.ForeignKey(UserOrder, on_delete=models.CASCADE)
    ...

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


一个UserOrder可以有许多UserOrderService实例。

因此,正确的 COUNT 方法是:

.annotate(total_no_of_services=Count("userorderservice_set"))

请看反向关系


推荐阅读