2009-03-19 6 views
0
return sum(jobrecord.get_cost() or 0 
    for jobrecord in self.project.jobrecord_set.filter(
     date__lte=date, 
     date__gte=self.start_date) or 0) 

Répondre

3

Après un petit rewrite

query = self.project.jobrecord_set.filter(
     date__lte=date, 
     date__gte=self.start_date) 
values= (jobrecord.get_cost() or 0 for jobrecord in query or 0) 
return sum(values) 

Regardez bien l'values= (jobrecord.get_cost() or 0 for jobrecord in query or 0)

Que se passe lorsque la requête est vide?

Vous évaluez jobrecord.get_cost() or 0 for jobrecord in 0

1

0 est en effet pas itérable. Je pense que vous voulez laisser tomber ce dernier or 0. Lorsque la requête de filtre ne correspond à aucun élément, elle renverra une requête vide et votre somme sera simplement 0, puisque sum([]) est zéro.

S'il existe une raison pour laquelle la requête peut déclencher une exception (dates non valides ou certaines de ces dates), une clause ou ne l'attrape pas non plus. [][1] or 0 soulève toujours une exception.