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()
onfilter
和exclude
子句中的对象不同,在使用F()
对象时不能引入连接update
- 您只能引用要更新的模型的本地字段.如果你试图引入一个F()
对象的连接,FieldError
将会引发一个[.]
https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once
我偶然发现了这个主题,并注意到 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)