Невозможно подключить график matplot к базе данных в Django - PullRequest
0 голосов
/ 01 марта 2020

Я был бы очень признателен за любую помощь в моей проблеме:

Цель:

Я пытаюсь построить график 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 %}

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...