如何返回用户进行交易的每种不同货币的总和(金额)总和(total_price)



我正在尝试返回一个在 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'})

下面的网页

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

销售表格如下

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',
        }

在 Django ORM 中使用 GROUP BY 作为

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'))

然后视图变成,

from django.db.models.aggregates import Sum

@login_required
def portfolio(request):
    context = {
        'transactions': Transaction.objects.filter(owner=request.user).values('currency').annotate(
            sum_amount=Sum('amount'),
            sum_total_price=Sum('total_price'))
    }
    return render(request, 'webapp/portfolio.html', context, {'title': 'Portfolio'})

试试这个

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')}]>

最新更新