首页 > 解决方案 > 如何将组合查询集添加到一个模板表中

问题描述

我有 3 个模型,分别是 CarDetailsAdd、ShippingDetails、MaintenanceDetails。ShippingDetails 和 MaintenanceDetails 模型连接到 CarDetailsAdd 外键,每个模型都有一个价格字段。这是 我如何解决这个问题并将数据放在一行中的问题

#View
    def get(self, request, *args, **kwargs):
        profit = CarDetailsAdd.objects.filter(status='sold')
        total_profit = profit.aggregate(Sum('profit_amount'))['profit_amount__sum']
        shipping = ShippingDetails.objects.filter(car__status='sold').values(
            'car').annotate(
            total_shipping_price=Sum('price'))
        maintenance = MaintenanceDetails.objects.filter(car__status='sold').values(
            'car').annotate(
            total_maintenance_price=Sum('price'))
        query = chain(shipping, total_profit, maintenance)
        context = {
            'profit_data': query,
            'total_amount_profit': total_profit,
        }
        return render(request, 'pdf/profit.html', context)
#template
   <tbody>
      {% for profit_data in profit_data %}
      <tr style="text-align: center">
         <td>{{ profit_data.name }}</td>
         <td>{{ profit_data.purchased_amount }}</td>
         <td>{{ profit_data.total_shipping_price }}</td>
         <td>{{ profit_data.total_maintenance_price }}</td>
         <td>{{ profit_data.sold_details.sold_amount }}</td>
         <td>{{ profit_data.profit_amount }}</td>
      </tr>
      {% endfor %}
</table>

标签: djangodjango-templates

解决方案


您现在正在做的是创建三个不同的查询并将它们简单地连接起来。结果是每辆车有 3 个不同的对象,因为 Django 不知道要组合哪些结果。

处理此问题的最佳方法是创建一个查询,并使用从关系派生的值对其进行注释。您可以使用与 relationship_name__property 的关系中的值来注释 CarDetailsAdd 查询。

我不确定您的模型是什么样的,但假设 CarDetailsAdd 有两个称为 shipping_details 和 maintenance_details 的多对多关系,您可以执行以下操作:

def get(self, request, *args, **kwargs):
    total_profit = profit.aggregate(Sum('profit_amount'))['profit_amount__sum']

    profit = CarDetailsAdd.objects.filter(status='sold')
        .annotate(total_shipping_price=Sum('shipping_details__price')
        .annotate(total_maintenance_price=Sum('maintenance_details__price')

    context = {
        'profit_data': profit,
        'total_amount_profit': total_profit,
    }
    return render(request, 'pdf/profit.html', context)

推荐阅读