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()