2010-11-01 7 views
0

Je suis nouveau à Django et j'aimerais comprendre comment utiliser les gestionnaires. J'ai lu la documentation mais j'ai besoin d'un peu d'aide pour la mettre en pratique.Django: question de débutant sur les gestionnaires de modèles

J'ai modèles comme suit:

class Place(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300) 
class PlaceRef(models.Model): 
    place = models.ForeignKey(Place) 
    entry = models.ForeignKey(Entry) 
    value = models.FloatField() 
    units = models.CharField(max_length=30) 

Si j'avais un particulier Place, dois-je utiliser un gestionnaire pour ajouter la valeur de toutes les PlaceRefs qui lui est associée? (En supposant par souci de simplicité que toutes les unités sont les mêmes ...)

place = Place.objects.get(id=id) 
value = PlaceRef.objects... # what to do here? 

Répondre

1

Pas besoin de manager ici. Il existe déjà un gestionnaire automatique qui gère la relation entre Place et PlaceRef - il est accessible via place.placeref_set. Mais pour additionner les valeurs, vous devez utiliser aggregation - spécifiquement, la méthode aggregate.

from django.db.models import Sum 
value = place.placeref_set.aggregate(Sum('value')) 

maintenant value est un dictionnaire avec une valeur unique contenant la somme de toutes les valeurs dans les PlaceRefs associées.

1

Vous pouvez également ajouter cela comme un attribut de lieu

class Place(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300) 

    @property 
    def placeref_total(self): 
     do your calculation here as suggested in Daniel's answer 
     value = self.placeref_set.aggregate(Sum('value')) 
     return value 

alors vous pouvez consulter dans votre code:

myplace = Place.objects.get(id=x) 
    myplace.placeref_total 

Si vous n'utilisez pas le décorateur @property, puis dénommez-le comme: myplace.placeref_total()

Questions connexes