【问题标题】:Using existing field values in django update query在 django 更新查询中使用现有字段值
【发布时间】:2017-11-17 18:53:09
【问题描述】:

我想更新一个表中的一堆行来设置id = self.id。我将如何执行以下操作?

from metadataorder.tasks.models import Task
tasks = Task.objects.filter(task_definition__cascades=False)
        .update(shared_task_id=self.id)

等效的 SQL 是:

update tasks_task t join tasks_taskdefinition d
    on t.task_definition_id = d.id
set t.shared_task_id = t.id
    where d.cascades = 0

【问题讨论】:

  • 您的意思是要将每一行的shared_task_id 设置为该行中的id 值,还是要将多行的shared_task_id 设置为单个值你是从self得到的?
  • 为每一行设置它自己

标签: django django-models


【解决方案1】:

您可以使用F expression

from django.db.models import F
tasks = Task.objects.filter(task_definition__cascades=False)
    .update(shared_task_id=F('id'))

update 调用中可以对 F 对象执行的操作有一些限制,但在这种情况下可以正常工作:

更新调用也可以使用F expressions根据模型中另一个字段的值更新一个字段。

然而,与filterexclude 子句中的F() 对象不同,当您在update 中使用F() 对象时,您不能引入连接——您只能引用正在更新的模型的本地字段.如果您尝试使用 F() 对象引入连接,则会引发 FieldError [.]

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

【讨论】:

    【解决方案2】:

    我偶然发现了这个话题,并注意到 Django 对使用外键进行更新的限制,所以我现在在 Django 中使用原始 SQL:

    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute("UPDATE a JOIN b ON a.b_id = b.id SET a.myField = b.myField")
    

    【讨论】:

    • 对于 PostgreSQL:UPDATE a SET myField = b.myField FROM b WHERE a.b_id = b.id
    猜你喜欢
    • 2011-07-10
    • 2021-05-17
    • 2019-11-10
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2021-12-24
    • 2012-03-26
    相关资源
    最近更新 更多