3 votes

Django - afficher les sommes d'un tableau d'enregistrements

J'ai une table qui contient une liste de factures et leurs détails :

class Invoice(models.Model):
    invoiceNum = models.CharField(etc...)
    invoiceDate = models.DateField(etc...)
    customerID = models.ForeignKey(etc...)
    isPaid = models.CharField(etc...)

El Invoice Les enregistrements ne contiennent pas le total réel de la facture. Au lieu de cela, le total d'une facture est composé de plusieurs éléments suivants Invoice_Line_Item qui se trouvent dans une autre table :

class Invoice_Line_Item(models.Model):
    invNum = models.ForeignKey(Invoice)
    itemName = models.CharField(etc...)
    itemPrice = models.DecimalField(etc...)

J'ai une application Web qui affiche toutes les factures dans un grand tableau HTML, ainsi que tous les détails de cette facture dans le tableau. tr rang. Les détails tels que la date de facturation, le numéro de facture, l'identifiant du client, proviennent tous de cette ligne. Invoice table. Il y a des centaines de factures à afficher dans ce tableau. HTML table .

J'aimerais également afficher la valeur totale de chaque facture, qui correspond à la somme de tous les postes. Cependant, je ne trouve pas de moyen simple d'y parvenir, car les détails de la facture et les postes qui constituent le total de la facture se trouvent dans deux tables différentes.

J'ai pensé qu'une façon de faire était de passer l'ensemble du Invoice_Line_Item querySet dans le modèle HTML, puis pour chaque facture affichée dans un tableau tr je pourrais itérer sur l'ensemble du Invoice_Line_Item querySet, en additionnant tous les postes qui correspondent à la facture actuelle. Cette méthode semble toutefois très inefficace.

Avez-vous une meilleure idée de la façon de procéder ?

Merci !

4voto

nulvinge Points 1259

Un mot : Agrégation

Invoice_Line_Item.objects.filter(invNum=invoice).aggregate(Sum('itemPrice'))

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

Une autre solution consiste à stocker le total dans la facture et à le mettre à jour chaque fois que vous modifiez un élément lié. Invoice_Line_Item

0voto

lesnik Points 156

Encore un mot : annoter.

from django.models import Sum

Invoice.objects.filter( .. ).annotate( InvTotal=Sum( 'invoice_line_number__itemPrice' ) ) 

InvTolal devient un nouvel attribut de l'objet Invoice, vous pouvez l'utiliser dans le modèle de la même manière que invoiceNum ou invoiceDate.

Avec cette approche, vous ne devez pas transmettre de structures de données supplémentaires à votre modèle, mais seulement un QuerySet of Invoices.

Veuillez noter : L'argument de Sum est une chaîne de caractères, qui est une concaténation du nom du modèle lié converti en minuscules, puis du double '_', et enfin du nom d'un champ dans le modèle lié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X