Mon objectif est de créer une requête pour regrouper des «frais» uniques et les compter. Ensuite, implémentez correctement une boucle for, qui serait dans un graphique à secteurs montrant plusieurs tranches, chaque tranche individuelle montrant le nombre total par charge unique. Mon problème est d'utiliser mes requêtes actuelles que je rencontre avec l ' erreur d'attribut' dict 'object has no attribute' charge '. J'ai essayé différentes manières d'écrire la requête et j'apprécierais des commentaires lors de la rédaction d'une requête ou dans ma boucle for.

# Models.py
class Arrest(models.Model):
    number = models.IntegerField()
    date = models.DateField()
    charge = models.CharField(max_length=64)
# Views.py
def visuals(request):
    data = []
    labels = []

    # The two queries I have tried.
    # queryset = Arrest.objects.values('charge').annotate(the_count=Count('charge'))
    # queryset = Arrest.objects.values('charge').order_by('charge').annotate(the_count=Count('charge'))
    
    for arrest in queryset:
        data.append(arrest.charge)
        labels.append(arrest.charge)

    return render(request, "data/visuals.html", {
    'labels': labels,
    'data': data,
    })
# Error
AttributeError at /visuals

'dict' object has no attribute 'charge'
# visuals.html
{% extends "data/layout.html" %}
{% block head %}
<title>Visuals</title>
{% endblock %}
{% block body %}
{% load static %}
<div class="title2">
  <h2>Visuals (include links for invdividuals graphs)</h2>
</div>
<div class="body-text">
  <div id="container" style="width: 75%;">
    <canvas id="pie-chart"></canvas>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
  <script>
    var config = {
      type: 'pie',
      data: {
        datasets: [{
          data: {{ data|safe }},
          backgroundColor: [
            '#696969', '#808080', '#A9A9A9', '#C0C0C0', '#D3D3D3'
          ],
          label: 'Population'
        }],
        labels: {{ labels|safe }}
      },
      options: {
        responsive: true
      }
    };

    window.onload = function() {
      var ctx = document.getElementById('pie-chart').getContext('2d');
      window.myPie = new Chart(ctx, config);
    };
  </script>
</div>
{% endblock %}
1
sus_zeus 26 août 2020 à 04:15

2 réponses

Meilleure réponse

La solution nécessite de modifier views.py en deux parties, une nouvelle requête et une conversion en liste. Le JS va bien.

def visuals(request):
    queryset = Arrest.objects.order_by('charge').values('charge').annotate(charge_count=Count('charge'))

    data = list(queryset.values_list('charge_count', flat=True))
    labels = list(queryset.values_list('charge', flat=True))

    return render(request, "data/visuals.html", {
    'labels': labels,
    'data': data,
    })
0
sus_zeus 5 sept. 2020 à 19:55

D'après la documentation, je pense que vous devrez peut-être vérifiez à nouveau. Mais cela pourrait être la solution.

queryset = Arrest.objects.annotate(Count('charge'))
for arrest in queryset:
    data.append(arrest.charge__count)
    labels.append(arrest.name)

Ici, je suppose que labels fait référence au nom de chaque donnée et modifie votre code d'origine.

0
gunsodo 26 août 2020 à 05:36