tengo un modelo:
lifecycle_status_choice = ( ('Lead', 'Lead'), ('Opportunity', 'Opportunity'), ('Customer', 'Customer'), ) bill_status_choice = ( ('Paid','Paid'), ('Pending','Pending'), ('Partially Paid','Partially Paid'), ) class Bill(models.Model): company_name = models.ForeignKey(Contact, on_delete=models.CASCADE) grand_tot = models.DecimalField(max_digits=9, decimal_places=2) status = models.CharField(max_length=100, choices=bill_status_choice) lifecycle_status = models.CharField(max_length=100, choices=lifecycle_status_choice) ...que tiene un fk para:
class Contact(models.Model): associated_company = models.CharField(max_length=100) ...Vistas.py
... from bills.models import Bill from django.db.models import Sum def home(request): data = Bill.objects.all().order_by('date') context = { 'data ':data , } return render(request, 'home.html',context)Gráficos front-endjs:
const ctx = document.getElementById('myChart').getContext('2d'); const myChart = new Chart(ctx, { type: 'doughnut', data: { labels: [ {% for data in data %} '{{data.company_name}}', {% endfor %} ], datasets: [{ label: '# of Votes', data: [{% for data in data %} {{ data.grand_tot }}, {% endfor %}],El problema: estoy usando charts.js en mi plantilla de front-end y estoy tratando de mostrar un gráfico en el que, a medida que un usuario crea nuevos nombres de empresas, el gráfico debe mostrar la cantidad total agrupada por nombres de empresas. ¿Cómo lo lograría?
por ejemplo: creo dos facturas para la empresa "xyz" con montos: $100 y $200 || & crear una factura para la empresa "abc" con un monto de $100. Quiero que el gráfico agrupe los montos de las facturas "xyz" y muestre $300 (es decir, 100+200) || & "abc" = $100
Para su información, soy consciente de que estoy usando algo completamente incorrecto en la función de vista, pero es algo que probé. Gracias
Puede .annotate(…) [Django-doc] con:
from django.db.models import Sum Contact.objects.annotate( bills_total=Sum('bill__grand_tot') ) Los objetos de Contact que surgen de este QuerySet tendrán un atributo adicional .bills_total .
Puede filtrar esto con como satus pagado con:
from django.db.models import Q , Sum contacts = Contact.objects.annotate(bills_total=Sum('bill__grand_tot', filter=Q(bill__status='Paid')))Por lo tanto, puede, por ejemplo, renderizar esto con:
{% for contact in contacts %} {{ contact.associated_company }}: {{ contact.bills_total }} {% endfor %}o conviértalo en una lista de diccionarios de Python, por ejemplo, y luego devuélvalo como un blob JSON.