как я могу вернуть сумму (сумму) сумму (total_price) для каждой отдельной валюты, с которой пользователь совершил транзакцию - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь вернуть набор запросов в django, который возвращает общую сумму покупки SUM (сумму), общую цену, уплаченную SUM (total_price) для каждой отдельной валюты, с которой пользователь совершил транзакции.Возможно ли это?Совет будет очень признателен

Модель транзакции ниже


class Transaction(models.Model):
    currency = models.CharField(max_length=20)
    amount = models.IntegerField()
    total_price = models.DecimalField(max_digits=8, decimal_places=2)
    date_purchased = models.DateTimeField()
    note = models.TextField(default="")
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

Функция ниже

@login_required
def portfolio(request):

    sum_amount = Sum('amount')
    sum_total_price = Sum('total_price')

    context = {
        'transactions': Transaction.objects.filter(owner=request.user).annotate(
            current_amount=sum_amount,
            purchased_amount=sum_total_price
        )
    }
    return render(request, 'webapp/portfolio.html', context, {'title': 'Portfolio'})

HTML ниже

            {% for transaction in transactions %}
            <tr>
                <td>{{transaction.current_amount}}</td>
                <td>{{transaction.purchased_amount}}</td>

            </tr>
            {% endfor %}

SaleForm Below

class SaleForm(forms.ModelForm):

    amount_sold = forms.IntegerField()
    total_price_sold = forms.DecimalField()
    date_sold = forms.DateField(
        widget=forms.TextInput(
            attrs={'type': 'date'}
        )
    )
    note = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Keep a Note?'}))

    class Meta:
        model = Sale
        fields = ('date_sold', 'amount_sold', 'total_price_sold', 'note')

        labels = {
            'date_sold': _('Sale Date'),
        }
        help_texts = {
            'date_sold': 'Use Calendar to enter date',
        }

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Используйте GROUP BY в Django ORM как

from django.db.models.aggregates import Sum

Transaction.objects.filter(owner=request.user).values('currency').annotate(
    sum_amount=Sum('amount'),
    sum_total_price=Sum('total_price'))

, тогда представление становится,

<b>from django.db.models.aggregates import Sum</b>


@login_required
def portfolio(request):
    context = {
        'transactions': <b>Transaction.objects.filter(owner=request.user).values('currency').annotate(
            sum_amount=Sum('amount'),
            sum_total_price=Sum('total_price'))</b>
    }
    return render(request, 'webapp/portfolio.html', context, {'title': 'Portfolio'})
0 голосов
/ 27 апреля 2019

Попробуйте это

Transaction.objects.filter(owner=request.user).values('currency', 'owner').annotate(amount_sum=Sum('amount'), total_price_sum=Sum('total_price'))

Это вернет что-то вроде этого

<QuerySet [{'currency': 'BDT', 'owner': 1, 'amount_sum': 123, 'total_price_sum': Decimal('90')}, {'currency': 'USD', 'owner': 1, 'amount_sum': 11, 'total_price_sum': Decimal('30')}]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...