2013-10-06 2 views
0

у меня есть модели, как это:Применить условие в этом запросе в Джанго

class Category(models.Model): 

    user = models.ForeignKey(User) 
    name = models.CharField(max_length=128) 
    budget = models.DecimalField(default=0.0, decimal_places=2, max_digits=8, help_text="Amount in dollars ($)") 

class Task(models.Model): 

    description = models.CharField(max_length=128) 
    owner = models.ForeignKey(User, default="bride") 
    category = models.ForeignKey(Category) 
    cost = models.DecimalField(default=0.0, decimal_places=2, max_digits=6, help_text="Amount in dollars ($)") 

Я хочу найти сумму всех бюджетов каждой категории и показать remaining budget:

categories = Category.objects.filter(user_id=request.user.id).order_by("name") 
categories_cost = [Task.objects.filter(category=i).aggregate(Sum('cost')) for i in categories] 

category_budget = [i.budget for i in categories] 

categories = zip(categories, remaining_budget) 

Некоторые категории не могут есть задача еще. Таким образом, categories_cost будет выглядеть следующим образом:

[{'cost__sum': None}, {'cost__sum': Decimal('0.00')}, {'cost__sum': None}, {'cost__sum': Decimal('300.00')}] 

Так что, когда я пытаюсь вычитать я получаю эту ошибку:

>>> remaining_budget = [i.budget - j['cost__sum'] for i, j in zip(categories, rem)] 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: unsupported operand type(s) for -: 'Decimal' and 'NoneType' 

Как решить эту проблему?

+0

В операции между бюджетом и None, что бы вам нравятся результаты показать? – yuvi

+0

Я хочу показать полный бюджет категории. – pynovice

ответ

0

Существует множество решений. Это самый простой:

remaining_budget = [i.budget - (j['cost__sum'] or 0) for i, j in zip(categories, rem)] 

или с помощью карты:

rem = map(lambda x: (x or 0), rem) 

или с помощью фильтра:

def no_nones(item): 
    if item is None: 
     return 0 
    return item 

rem = filter(no_nones, rem) 
Смежные вопросы