我想在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
但所有这些都返回相同的数据。我的更新声明有什么问题?
答案 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
。