Я был бы очень признателен за любую помощь в моей проблеме:
Цель:
Я пытаюсь построить график pp 1050 * с данными из моя база данных sqlite.
Мне удалось нарисовать простую диаграмму p ie на моей веб-странице (без использования базы данных).
Моя проблема:
В порядке чтобы соединить данные из моей базы данных, я использовал методы filter () и aggregate () . На веб-странице сюжет не загружается (я получаю только символ изображения).
Что я хочу построить:
На моем графике я хочу отобразить сумму затрат (расходов) в каждой категории в виде графика ap ie.
Вот мой код:
models.py:
CHOICES = (
('rent', 'Rent'),
('grocery', 'Grocery'),
('shopping', 'Shopping'),
('gym', 'Gym'),
('phone', 'Phone'),
('freetime', 'Freetime'),
('other', 'Other')
)
class UserDetails(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="new_spending", null=True)
expense_name = models.CharField(max_length=255)
cost = models.FloatField()
date_added = models.DateTimeField()
category = models.CharField(max_length=25, choices=CHOICES)
notes = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return self.title
views.py:
from django.shortcuts import render
from django.http import HttpResponse
import matplotlib.pyplot as plt
from django.db.models import Sum
from .models import UserDetails
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
def statistics(request):
return render(request, "budget_app/statistics.html")
def test_plot(request):
fig = Figure()
ax = fig.add_subplot(111, aspect='equal')
#The problem must lie here:
wedges = [UserDetails.objects.filter(user=request.user, category='rent').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='grocery').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='shopping').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='gym').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='phone').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='freetime').aggregate(Sum('cost')),
UserDetails.objects.filter(user=request.user, category='other').aggregate(Sum('cost'))]
# wedges = []
#for element in UserDetails.category:
# wedges.append(UserDetails.objects.filter(user=request.user, category=element).aggregate(Sum('cost'))
labels = ['rent', 'grocery', 'shopping', 'gym', 'phone', 'freetime', 'other']
ax.pie(wedges, labels=labels, colors=['b', 'r', 'g', 'c', 'm', 'y', 'k'])
ax.legend(wedges, labels=labels, title='legend title', loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
ax.set_title('Spending statistics per category')
canvas=FigureCanvas(fig)
response=HttpResponse(content_type="image/jpg")
canvas.print_jpg(response)
return response
urls.py:
urlpatterns = [
...
path('statistics/', views.statistics, name='statistics'),
path('test_plot/', views.test_plot, name='test_plot'),
]
статистика. html:
{% extends 'budget_app/budget_base.html' %}
{% block title %}Statistics{% endblock title %}
{% block content %}
<body>
<h2>Your spending statistics:</h2>
</br>
</br>
<img src="/budget_app/test_plot/" width="600px" />
</body>
{% endblock content %}
Спасибо!