Django Рассчитать начальный баланс SQL-запрос - PullRequest
0 голосов
/ 11 марта 2019

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

Здесь необходимо рассчитать начальные и конечные сальдо.

Модель:

class Item(models.Model):
    item = models.CharField(max-length=50)
    opening_balance = models.PositiveIntegerField()

class Transaction(models.Model):
    item_name = models.ForeignKey(Item, on_delete=models.CASCADE)
    purchases = models.PositiveIntegerField()
    sales = models.PositiveIntegerField()

View

def display_balances(request):
    balances = []

    items = Item.objects.all()
    for i in items:
        opening = i.opening_balance

        bal = Transaction.objects.filter(item_name=i)
        for item in bal:
            dict = {}

            opening_balance = opening
            closing_balance = opening_balance + item.purchases - item.sales
            opening = closing_balance
            dict['item']=item.item_name
            dict['opening']=opening_balance
            dict['purchases']=item.purchases
            dict['sales']=item.sales
            dict['closing']=closing_balance
            balances.append(dict)
return render(request, '123/details.html', {'balances':balances})

Template

{% for b in balances %}
  <td>{{b.item}}</td>
  <td>{{b.opening}}</td>
  <td>{{b.purchases}}</td>
  <td>{{b.sales}}</td>
  <td>{{b.closing}}</td>
{% endforfor %}

Выход:

item    opening purchases sales closing
abc     10      20        10     20
abc     20      10        15     15
abc     15      0         10     5
def     15      15        10     20
abc     5       10        5      10
def    20       0         5      15

и так далее ...

Мне нужен кто-то, чтобы помочь мне преобразовать View Logic в sql-запрос вместо использования List of Dictioneries, как я делаю. становится медленным, когда база данных громоздка.

1 Ответ

0 голосов
/ 11 марта 2019

Вам просто нужно посмотреть что-то вроде ниже и передать весь набор запросов trans в шаблон. Тогда в шаблоне, в цикле, вы сможете вызвать trans_item.item_number.opening_balance Это будет только один вызов в дб.

 def display_balances(request):
    trans = Transaction.objects.all().select_related('item_number')
    return render(request, '123/details.html', {'balances': trans})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...