Как объединить сумму нескольких таблиц в одном запросе с внешним ключом 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 %}