1
votes

Comment obtenir la somme par ligne de toutes les valeurs précédentes dans la colonne à l'aide de django queryset

Je souhaite obtenir la somme par ligne de toutes les valeurs précédentes du montant de la colonne.

models.py

Id   paid_into   payment_date   amount    SumAmount
---------------------------------------------------------
1     ONLINE      12-09-2019        40.00     40.00
2     ONLINE      12-09-2019        40.00     80.00
3     ONLINE      12-09-2019        45.00     125.00         
4     ONLINE      12-09-2019        50.00     175.00

J'ai essayé l'ensemble de requêtes

pay_receipt = PaymentRecord.objects.filter(Q(payment_date__range=[startdate, enddate]),Q(paid_into='ONLINE') | Q(paid_into='CHEQUE')).annotate(totals=Sum('amount')).order_by('payment_date')

Je veux le résultat comme celui-ci

class PaymentRecord(models.Model):
    invoice_no = models.ForeignKey(Invoice, unique=False, related_name='paymentrecord', on_delete=models.CASCADE)
    amount = models.CharField(max_length=10)
    paid_into = models.CharField(max_length=40, choices=PAID)
    payment_date = models.DateField(auto_now=False, auto_now_add=False)
    cheque_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
    cheque_no = models.CharField(max_length=20, null=True, blank=True)
    notes = models.CharField(max_length=100, null=True, blank=True)


0 commentaires

3 Réponses :


-1
votes

Vous pouvez essayer ceci est simplement du code pour vous, j'espère que cela fonctionnera!

<td>{{ query}}</td>

dans le fichier html:

query = ModelName.objects.aggregate(Sum('field_name'))
context = {'query':query}
reutrn render(request,'your_template_name',context)


6 commentaires

Je veux que le résultat soit sage.


@SachinSingh Essayez ceci, cela fonctionnera également pour les lignes


j'obtiens un résultat sous forme de dict. {'amount__sum': 157925.0} comment puis-je imprimer le tableau que j'ai mentionné ci-dessus.


Vous pouvez simplement ajouter du contexte et ajouter dans votre fichier html


pouvez-vous s'il vous plaît partager un extrait comment faire cela.


Réponse @SachinSingh mise à jour



0
votes

Sur Django> = 2 et sur une base de données prise en charge, vous pouvez utiliser la fonction Window pour obtenir l'accumulation:

from django.db.models import Window, Sum

PaymentRecord.objects.filter(...).annotate(
    SumAmount=Window(Sum(F('amount')), order_by=F('pk').asc())
).values('id', 'paid_into', 'payment_date', 'amount', 'SumAmount')


1 commentaires

J'utilise mysql 5.7 et j'obtiens une erreur de syntaxe près de '(ORDER BY account_paymentrecord . id ASC) AS SumAmount FROM `account_payment'



0
votes

Vous obtiendrez probablement ce que vous voulez avec les éléments suivants:

from django.db.models import Window, Sum
PaymentRecord.objects.filter(...).annotate(
    SumAmount=Window(
        Sum(F('amount')),
        partition_by=F('paid_into'),
        order_by=F('payment_date').asc()
    )
).values('id', 'paid_into', 'payment_date', 'amount', 'SumAmount')


0 commentaires