我想更新表中的一堆行来设置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
答案 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")