我想在以下模型中一次更新多个整数字段。
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)
我该如何解决这个问题?
答案 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)