Django,从模型更新

时间:2010-02-09 05:44:11

标签: django django-models django-queryset

假设我有这个小模型:

class Deal(models.Model):
    purchases = models.IntegerField(default=0)#amount of purchases so far

    increase_purchases(self,to_add):
        self.update( purchases =self.purchases + to_add)

当我尝试在shell中使用这个increase_purchases模型时:

>>> x = Deal.objects.get(id=1)
>>> x.increase_purchases(4)
AttributeError: 'Deal' object has no attribute 'update'

如何为模型编写适当的功能,以便我可以根据需要更新所选的查询购买?

4 个答案:

答案 0 :(得分:3)

根据您的示例和说明,您可能需要以下内容:

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count = self.purchase_count + quantity

我同意伊格纳西奥;修改对象然后保存它。所以在shell中:

> great_deal = Deal.objects.get(id=1)
> great_deal.purchase(4)
> great_deal.save()
> # or w/o an explicite argument it will record a single purchase
> # great_deal.purchase()

是的,我在Deal模式中重新命名了一些东西。它似乎更具描述性。

答案 1 :(得分:1)

修改相应的字段,然后在实例上调用save()

答案 2 :(得分:1)

或者使用+ =表达式来获得更干净的代码:

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count += quantity

答案 3 :(得分:1)

在Django 1.6.2中。遇到这种行为并使用"过滤器"然后更新按预期工作。例如,Students.objects.select_for_update()。filter(id = 3).update(score = 10)

只是fyi:除非您正在处理事务,否则使用save()单独修改每个字段可能会在多线程环境中创建数据不一致。当threadA在模型上调用save()时,另一个threadB可以更改模型字段并保存。在这种情况下,threadA必须读取更新的模型并进行更改。