Django - 一次更新多个整数字段

时间:2015-08-07 23:58:38

标签: django django-queryset

我想在以下模型中一次更新多个整数字段。

class Foo(models.Model):
     field_a = models.PositiveIntegerField()
     field_b = models.PositiveIntegerField()
     field_c = models.PositiveIntegerField()

最初,可以像下面的代码一样进行两次查询。

foo = Foo.objects.get(id=1)
foo.field_a += 1
foo.field_b -= 1
foo.field_c += 2
foo.save()

我想在一个查询中使update更简单。

但是,以下尝试引发了错误。

# 1st attempt
Foo.objects.filter(id=1).update(
        field_a=F('field_a')+1, 
        field_b=F('field_a')-1,
        field_c=F('field_a')+2)

# 2nd attempt
Foo.objects.filter(id=1).\
        update(field_a=F('field_a')+1).\
        update(field_b=F('field_b')-1) ).\
        update(field_c=F('field_c')+2)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

在更新之前,您必须拥有Foo实例或查询集。你应该这样做:

Foo.objects.get(id=1)update(field_a=F('field_a')+1).\
        update(field_b=F('field_b')-1) ).\
        update(field_c=F('field_c')+2)

Foo.objects.filter(id__in=[1,3,6,7]).update(field_a=F('field_a')+1).\
        update(field_b=F('field_b')-1) ).\
        update(field_c=F('field_c')+2)

参考: https://docs.djangoproject.com/en/1.8/topics/db/queries/#updating-multiple-objects-at-once

答案 1 :(得分:0)

形成django docs

更新调用也可以使用 F表达式根据模型中另一个字段的值更新一个字段。这对于基于其当前值递增计数器特别有用。例如,要增加博客中每个条目的pingback计数:

>>> from django.db.models import F
>>> Entry.objects.all().update(n_pingbacks=F('n_pingbacks') + 1)