Django 如何从查询集中批量复制和更改多个模型的属性?

Django 如何从查询集中批量复制和更改多个模型的属性?,django,django-orm,Django,Django Orm,我知道,通过将模型的pk设置为None并保存,可以强制复制模型的实例 myModel = MyModel.objects.get(..) myModel.pk = None myModel.save() # -> Creates a new copy 如果我想在整个queryset上这样做呢 MyModel.objects.filter(...) 我应该重复一遍,然后一个接一个地做吗?还是可以更有效地实现这一点 用例: 每次创建新用户时,我都需要复制一组默认分配给他的模型和相关模型:

我知道,通过将模型的
pk
设置为
None
并保存,可以强制复制模型的实例

myModel = MyModel.objects.get(..)
myModel.pk = None
myModel.save() # -> Creates a new copy
如果我想在整个queryset上这样做呢

MyModel.objects.filter(...)
我应该重复一遍,然后一个接一个地做吗?还是可以更有效地实现这一点


用例:

每次创建新用户时,我都需要复制一组默认分配给他的模型和相关模型:

def save(self, **kwargs):
    super(User, self).save(**kwargs)
    for c in MyModelCategory.objects.filter(mymodel__is_default=True):
        c.pk = None
        c.user = self.user
        c.save()
        for s in MyModel.objects.filter(category=c):
            s.pk = None
            s.user = self.user
            s.save()

我认为没有一种简单的方法可以在不迭代整个queryset的情况下实现这一点

使此函数更有效的一种方法是使用
transaction.atomic()
,如下所示:

def save(self, **kwargs):
    super(User, self).save(**kwargs)
    with transation.atomic():
        for c in MyModelCategory.objects.filter(mymodel__is_default=True):
            c.pk = None
            c.user = self.user
            c.save()
            for s in MyModel.objects.filter(category=c):
                s.pk = None
                s.user = self.user
                s.save()