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

 月在杏花枝 发布于 2023-02-13 12:58

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

Peter DeGlop.. 20

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

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

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

1 个回答
  • 您可以使用F表达式执行此操作:

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

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

    2023-02-13 13:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有