在django更新查询中使用现有字段值

Dav*_*542 8 django django-models

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

from metadataorder.tasks.models import Task
tasks = Task.objects.filter(task_definition__cascades=False)
        .update(shared_task_id=self.id)
Run Code Online (Sandbox Code Playgroud)

等效的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
Run Code Online (Sandbox Code Playgroud)

Pet*_*per 20

您可以使用F表达式执行此操作:

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

F对于update调用中的对象可以做什么有一些限制,但它适用于这种情况:

调用更新还可以F expressions用于根据模型中另一个字段的值更新一个字段.

但是,与F()on filterexclude子句中的对象不同,在使用F()对象时不能引入连接update- 您只能引用要更新的模型的本地字段.如果你试图引入一个F()对象的连接,FieldError将会引发一个[.]

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


Pet*_*ter 5

我偶然发现了这个主题,并注意到 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")
Run Code Online (Sandbox Code Playgroud)

  • 对于 PostgreSQL:“从 b 更新一组 myField = b.myField,其中 a.b_id = b.id” (2认同)