2

假设我有这个小模型:

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

4 回答 4

4

根据您的示例和描述,您可能想要这样的东西:

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 模型中稍微重命名了一些东西。这种方式似乎更具描述性。

于 2010-02-09T07:46:47.273 回答
3

修改适当的字段,然后调用save()实例。

于 2010-02-09T05:46:25.567 回答
1

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

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

    def purchase(self, quantity=1):
       self.purchase_count += quantity
于 2010-02-09T12:44:27.720 回答
1

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

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

于 2015-04-06T09:35:29.850 回答