0

我想在 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 ($)")

我会有一个这样的新预算列表,它等于类别中的数据数量:

>>> 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

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

4

2 回答 2

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 中的预算数量完全匹配,并且类别上的迭代顺序也不明显。总而言之,这看起来很奇怪:)

于 2013-10-23T05:26:12.537 回答
0

当您调用updateaQuerySet时,它会将 中的所有项目设置QuerySet为该值。请参阅此处的示例。

因此,通过您的 for 循环,您将使用each更新所有Category对象。在 for 循环结束时,所有对象都应具有或最后一个预算项。user=2budgetCategorybudget == new_category_budget[-1]

如果您希望每个对象具有不同的值Category,则需要save单独调用它们。

于 2013-10-23T05:26:12.613 回答