2016-12-06 7 views
0

J'essaie de faire une application de feedback dans Django, mais je ne peux pas faire mes évaluations.Modèles Django avec des choix en nombre

Dans mon models.py, j'ai 5 choix de très mauvais à excellent. Mais je veux qu'ils soient utilisables en tant que nombres afin que je puisse évaluer la valeur globale. Après avoir lu Set Django IntegerField by choices=... name J'ai changé mes notes de VERYBAD = 'Très mauvais' à VERYBAD = 1 mais non je ne peux même pas enregistrer ma valeur/formulaire.

Feedback(models.Model): 
    event = models.ForeignKey(Event) 
    # Choice 
    VERYBAD = 'Very bad'   #old 
    BAD = 2       #new 
    OKAY = 3 
    GOOD = 4 
    EXCELLENT = 5 
    RATING = (
     (VERYBAD, 'Very bad'), 
     (BAD, 'Bad'), 
     (OKAY, 'Okay'), 
     (GOOD, 'Good'), 
     (EXCELLENT, 'Excellent'), 
    ) 

    # The ratings 
    organisation = models.CharField(
     max_length=9, 
     choices=RATING, 
     default=OKAY, 
    ) 
    .... 

Donc, à mon avis, je pensais pouvoir faire les calculs, mais je ne peux pas.

def rating(request, event_id): 
    myevent = Event.objects.get(id=event_id) 
    feedback_items = Feedback.objects.filter(event=myevent) 
    num_of_items = len(feedback_items) 

    def evaluate(feedback_items): 
     # The overall rating 
     organisation = 0 
     for item in feedback_items: 
      organisation += item.organisation 

     organisation /= num_of_items 

    context = {'feedback_items':feedback_items, 
      'num_of_items': num_of_items, 
      'myevent': myevent,} 

return render(request, 'feedback/rating.html', context) 

`

Répondre

0

Vous devez faire un organisationIntegerField, évidemment - ce que vous ne pouvez pas espérer faire des opérations entières. Si vous l'avez déjà en production, utilisez un ensemble de migrations pour ajouter un nouveau IntegerField, le remplir à partir des valeurs CharField existantes (en utilisant un dict pour mapper les anciennes valeurs de chaîne sur les nouvelles valeurs int) et enfin supprimer le champ d'origine.

En outre, vous voudrez peut-être apprendre à bien utiliser les fonctions ORM de Django comme obtenir des modèles liés instances et exécuter des agrégations au niveau de DB, à savoir:

from django.db.models import Sum, Count, Avg 

def rating(request, event_id): 
    myevent = Event.objects.get(id=event_id) 

    # this is how you get related models... 
    feedback_items = myevent.feedback_set.all() 

    # and this is how you use SQL aggregation functions: 
    values = feedback_items.aggregate(
     sum=Sum('organisation'), 
     count=Count('pk'), 
     avg=Avg('organisation') 
     ) 

    # Now 'values' should be a dict with 'sum', 'count' and 'avg' 
    # keys, and values['avg'] should be equal to 
    # float(values['sum'])/values['count'] 
    # FWIW you probably don't need the 'sum' field at all 
    # I mentionned it so you can check whether 'avg' value 
    # is correct... 

    context = { 
     'feedback_items':feedback_items, 
     'num_of_items': values['count'], 
     'avg': values['avg'], 
     'myevent': myevent, 
     } 

    # etc 
+0

Merci beaucoup. Après avoir relu le chapitre des requêtes de création, j'ai également réussi à faire une requête qui ne montre que mes combattants déjà enregistrés dans une catégorie d'événements. *Pouces vers le haut* –