2010-02-09 109 views
2

以为我这个小模型:Django的,从模型更新

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) 

,当我尝试使用这个从壳increase_purchases型号:

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

我如何写一个适当的功能模型以便我可以根据需要更新所选查询的购买情况?

回答

3

根据您的例子和说明,你可能想是这样的:

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

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

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

> 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

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

+0

但据我所知保存将保存一个新的实例,而我想更新现有的。视为 – Hellnar 2010-02-09 05:53:05

+0

如果PK为“无”或数据库中不存在,它将仅创建一条新记录。否则它会用上述PK更新现有记录。 – 2010-02-09 05:55:07

1

或者使用更清洁的代码+ =表达式:

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

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

是的,但是你如何在其他人可能也在做同样的事情的情况下完成这项工作? – Alper 2013-03-30 20:02:45

1

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

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