【问题标题】:Apply condition in this query in django在 django 的此查询中应用条件
【发布时间】:2013-10-13 00:43:09
【问题描述】:

我有这样的模型:

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'

如何解决?

【问题讨论】:

  • 在预算和无之间的运算中,您希望结果显示什么?
  • 我想显示该类别的全部预算。

标签: django django-queryset django-aggregation


【解决方案1】:

有很多解决方案。这是最简单的:

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)

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2016-06-10
    • 2016-09-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多