通过在 Django 中克隆只有一列更改的查询集,在一个操作中插入多行

Posted

技术标签:

【中文标题】通过在 Django 中克隆只有一列更改的查询集,在一个操作中插入多行【英文标题】:Insert multiple rows in one operation by cloning a queryset with only one column change in Django 【发布时间】:2014-03-23 21:38:39 【问题描述】:

我看到了以下链接: How do I clone a Django model instance object and save it to the database?

但是这个只做 1 个对象克隆。如果我想克隆多个克隆的对象怎么办。 例如。像这样:

foo_objects = Foo.objects.filter(col1=value1)
foo_objects.pk = None
foo_objects.col2=value2
foo_objects.save()

我知道我可以使用批量插入。如果有,请建议其他方法。

【问题讨论】:

【参考方案1】:

查询集上没有更新方法可以更新关系字段。您必须使用bulk_create() 来创建/保存多个对象。但在此之前遍历查询集以适当地设置属性。

类似

foo_objects = Foo.objects.filter(col1=value1)
for f in foo_objects:
    f.pk = None
    f.col2=value2
    f.save() #either do this or save with bulk create as

Foo.objects.bulk_create(foo_objects)

【讨论】:

这也是我想出来的。我不想创建完整的对象。我终于使用了 bulk_create。【参考方案2】:

如果你不想使用批量创建,你可以像这样自己控制事务提交

from django.db import transaction

with transaction.commit_on_success():
        for foo_object in foo_objects:
            foo_object.pk = None
            foo_objects.col2=value2
            foo_objects.save()

【讨论】:

以上是关于通过在 Django 中克隆只有一列更改的查询集,在一个操作中插入多行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 StringAgg 或 ArrayAgg 连接多个子行中的一列来注释 django 查询集?

数据库子查询 含义-分类-语句

django 模板从查询集更改了日期格式

MySQL随记 - 子查询

Mysql高手系列 - 第12篇:子查询详解

Django 可重用查询集