假设我有这个小模型:
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'
如何为模型编写适当的功能,以便我可以根据需要更新所选的查询购买?
答案 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必须读取更新的模型并进行更改。