Я хочу отобразить имя значения в django анотации - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь создать мини-банк, как приложение, где я могу делать депозиты и снятие денег В одном из шаблонов я хочу суммировать все депозиты и снятия в модели, которая имеет одно и то же название валюты, поэтому я использую аннотирование, которое работает нормально. Но я не смог отобразить название валюты в шаблоне. Вместо этого он отображает 1,2,3 вместо фунта, доллара, евро.

Вот соответствующая часть моей модели:

class Banks(models.Model):
    currency = models.ForeignKey(Currency, blank=True, null=True)
    total_deposits = models.IntegerField(blank=True, null=True)
    total_withdrawals = models.IntegerField(blank=True, null=True)

Вот вид:

result = Banks.objects.values('currency'
        ).order_by('currency'
        ).annotate(total_withdrawals=Sum('total_withdrawals')
        ).annotate(total_deposits=Sum('total_deposits')
        )

context = {
        "result": result,
        }

Вот шаблон:

<table class='table'>
          <thead>
            <tr>
              <th class='aligncenter'>#</th>
              <th class='aligncenter'>CURRENCY</th>
              <th class='aligncenter'>TOTAL DEPOSITS</th>
              <th class='aligncenter'>TOTAL WITHDRAWALS</th>
              <th class='aligncenter'>BALANCE</th>
            </tr>
          </thead>
        {% for instance in result %}
            <tr>
              <td class='aligncenter'>{{forloop.counter}}</td>
              <td class='aligncenter'>{{instance.currency}}</td>
              <td class='aligncenter'>{{instance.total_deposits}}</td>
              <td class='aligncenter'>{{instance.total_withdrawals}}</td>
              <td class='aligncenter'>{{instance.total_deposits|sub:instance.total_withdrawals}}</td>
            </tr>
        {% endfor %}
 </table>

вот шаблон вывода: enter image description here

Я хочу увидеть валюту имя под столбцом валюты. Не 1, 2 и 3

1 Ответ

2 голосов
/ 27 января 2020

Вы должны добавить название валюты к вашим значениям, вы можете сделать это с помощью:

from django.db.models import <b>F</b>

result = Banks.objects.values(
    'currency',
    <b>currency_name=F('currency__name')</b>
).order_by('currency', 'currency_name').annotate(
    total_withdrawals=Sum('total_withdrawals'),
    total_deposits=Sum('total_deposits')
)

(при условии, что Currency имеет поле name, если оно имеет другое поле, вы можете заменить это на F('currency__<i>fieldname</i>') для этого fieldname).

Затем вы можете отобразить это с помощью:

<td class='aligncenter'>{{ instance.<b>currency_name</b> }}</td>

При этом, поскольку вы здесь группировать по валюте, имеет смысл просто аннотировать ваши валюты, например:

result = <b>Currency</b>.objects.annotate(
    total_withdrawals=Sum(<b>'banks__total_withdrawals'</b>),
    total_deposits=Sum(<b>'banks__total_deposits'</b>)
)

Затем вы можете визуализировать объект instance, which will call the str (..) on the Currency` Например, с:

<td class='aligncenter'>{{forloop.counter}}</td>
<td class='aligncenter'>{{ <b>instance</b> }}</td>
<td class='aligncenter'>{{ instance.total_deposits }}</td>
<td class='aligncenter'>{{ instance.total_withdrawals }}</td>
<td class='aligncenter'>{{ instance.total_deposits|sub:instance.total_withdrawals }}</td>
...