在Django中一次更新多个结果

时间:2013-10-23 05:17:13

标签: django django-queryset

我想在Django中更新Category模型的预算。

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=12, help_text="Amount in dollars ($)")

我会有一个像这样的新预算列表,它等于Category:

中的数据数量
>>> new_category_budget
[Decimal('2700.000'), Decimal('750.000'), Decimal('1500.000')]

我正在更新:

>>> for budget in new_category_budget:
...     Category.objects.filter(user=2).update(budget=budget)
... 
3L
3L
3L

但所有这些都返回相同的数据。我的更新声明有什么问题?

2 个答案:

答案 0 :(得分:0)

您正在做的是迭代预算值,并使用user = 2更新所有记录到每个记录,覆盖之前的值。

QuerySet.update的返回值是更新记录的数量。每次调用update()时,都会得到3条记录的更新结果。

我不太明白你究竟想做什么,但它可能是这样的(未经测试!):

for (budget, category) in zip(new_category_budget, list(Category.objects.filter(user=2)):
  category.budget=budget
  category.save()

当然,这假设过滤类别的数量将与new_category_budget中的预算数量完全匹配,并且类别上的迭代顺序也不明显。总而言之,这看起来很奇怪:))

答案 1 :(得分:0)

当您在update上致电QuerySet时,会将QuerySet中的所有项目设置为该值。请参阅示例here

因此,通过for循环,您将所有Category个对象user=2更新为每个budget。在for循环结束时,所有Category个对象应该有budget == new_category_budget[-1]或最后一个预算项。

如果您想为每个Category对象设置不同的值,则需要逐个调用save