Как объединить сумму нескольких таблиц в одном запросе с внешним ключом Django ORM

Здесь я привожу таблицу Структура:

class MainTable(models.Model):
     code = models.CharField(max_length=25)
     qty = models.FloatField(default=0)


class Table1(models.Model):
     code = models.ForeignKey(MainTable, on_delete=models.CASCADE, related_name='table_one')
     date = models.DateField()
     qty = models.FloatField(default=0)


class Table2(models.Model):
     code = models.ForeignKey(MainTable, on_delete=models.CASCADE, related_name='table_two')
     date = models.DateField()
     qty = models.FloatField(default=0)

class Table3(models.Model):
     code = models.ForeignKey(MainTable, on_delete=models.CASCADE, related_name='table_three')
     date = models.DateField()
     qty = models.FloatField(default=0)

Мне нужен такой тип таблицы:

________________________________________________________
| Code |   qty   | table1_sum| table2_sum | table3_sum |
---------------------------------------------------------
|code1 |  5000   |    2000   |    3000    |    4000    |
---------------------------------------------------------
|code1 |  5000   |    2000   |    3000    |    4000    |
---------------------------------------------------------
|code1 |  5000   |    2000   |    3000    |    4000    |
--------------------------------------------------------

Я отслеживаю этот запрос, но он не дает правильного значения:

query = MainTable.objects.all().annotate(table1=(Sum('table_one__qty')),table12=(Sum('table_two__qty')),table3=(Sum('table_three__qty')))

В этом запросе таблица 1 дает фактическое значение, но другая таблица дает неправильное значение. нужен правильный запрос.

Вы можете создать представление следующим образом

def anno(request):
    #x = MainTable.objects.annotate(choice_count=Count('qty')) 
    x = MainTable.objects.annotate(main_sum=Sum('qty')) \
        .annotate(table1_sum=Sum('table_one__qty')) \
        .annotate(table2_sum=Sum('table_two__qty')) \
        .annotate(table3_sum =Sum('table_three__qty')) 
    # for y in x:
    #     print(y.main_sum)
    return render(request, 'demo.html', {'data': x})

В файле шаблона вы можете сделать следующее

<table style="width:100%">
  <tr>
    <th>Code </th>
    <th>QTY</th>
    <th>Table 1</th>
    <th>Table 2</th>
    <th>Table 3</th>
  </tr>
  {% for y in data %}
    <tr>
        <td>{{ y.code }}</td>
        <td>{{ y.qty }}</td>
        <td>{{ y.table1_sum }}</td>
        <td>{{ y.table2_sum }}</td>
        <td>{{ y.table3_sum }}</td>
       
    </tr>
  {% endfor %}
</table>

Измените следующим образом models.py

class MainTable(models.Model):
    code = models.CharField(max_length=25)
    qty = models.IntegerField(default=0)

    def table1_sum(self):
        return self.table_one.aggregate(Sum('qty'))

    def table2_sum(self):
        return self.table_two.aggregate(Sum('qty'))

    def table3_sum(self):
        return self.table_three.aggregate(Sum('qty'))

добавьте пользовательский тег template_tag: dict_key.py

from django import template

register = template.Library()


@register.filter
def first_item(item):
    total = item['qty__sum']
    if total:
        return total
    return '0'

В шаблоне:

{% load dict_key %}

{% for item in object_list %}
    <tr>
        <td>{{ item.code }}</td>
        <td>{{ item.qty }}</td>
        <td>{{ item.table1_sum|first_item }}</td>
        <td>{{ item.table2_sum|first_item }}</td>
        <td>{{ item.table3_sum|first_item }}</td>
    </tr>
{% endfor %}
Вернуться на верх