【问题标题】:Django - Update multiple integer fields at onceDjango - 一次更新多个整数字段
【发布时间】:2015-10-31 12:23:27
【问题描述】:

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

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 无法确定,因为更新不会返回查询集,而是返回更改的行数。但是尝试#1应该可以工作。您能否添加尝试 #1 获得的堆栈跟踪?
  • 抱歉打扰了。再次尝试时,第一次尝试效果很好。最好关闭这个帖子。

标签: django django-queryset


【解决方案1】:

你必须有一个 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

【讨论】:

  • 对不起,我忘了在我的代码中添加过滤器选项,我现在添加了它。但是,上面的代码会引发'long' object has no attribute 'update'
  • 如果是这样,也许这个问题线程有帮助:stackoverflow.com/questions/15304378/…
  • 谢谢,但我认为该解决方案与序列化 update 无关。
  • 据我所知,您最好先拥有一个实例,然后再进行更新。
【解决方案2】:

形成django docs

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

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

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多