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

时间:2013-12-02 20:54:16

标签: 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)

等效的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

2 个答案:

答案 0 :(得分:19)

您可以使用F expression

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

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

  

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

     

但是,与F()filter子句中的exclude个对象不同,当您在F()中使用update个对象时,无法引入联接 - 您只能引用要更新的模型的本地字段。如果您尝试使用F()对象引入联接,则会引发FieldError [。]

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

答案 1 :(得分: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")