Django-如何复制使用m2m字段和直通模型的模型实例
我正在尝试编写一个管理操作来复制下面的Circus模型 到目前为止,我的代码的问题是,当我尝试运行它时,会出现如下错误: 无法在指定中介的ManyToManyField上设置值 模型 以下是我的模型:Django-如何复制使用m2m字段和直通模型的模型实例,django,django-models,django-admin,Django,Django Models,Django Admin,我正在尝试编写一个管理操作来复制下面的Circus模型 到目前为止,我的代码的问题是,当我尝试运行它时,会出现如下错误: 无法在指定中介的ManyToManyField上设置值 模型 以下是我的模型: class Clown(models.Model): name = models.CharField(max_length=255) class Circus(models.Model): clowns = models.ManyToManyField(Clown, blank=
class Clown(models.Model):
name = models.CharField(max_length=255)
class Circus(models.Model):
clowns = models.ManyToManyField(Clown, blank=True, through='WorkedAt')
name = models.CharField(max_length=255)
class WorkedAt(models.Model):
clown = models.ForeignKey(Clown)
circus = models.ForeignKey(Circus)
以下是迄今为止admin.py中的代码:(尝试执行以下操作)
当您使用中间
至
表格时,您使用相关对象管理器(即对象小丑
)的能力受到限制。正如委员会所说:
与普通的多对多字段不同,您不能使用添加、创建或分配(即beatles.members=[…])来创建关系。。。。简单的add、create和assignment调用不提供指定此额外细节的方法。因此,对于使用中间模型的多对多关系,它们被禁用。创建此类关系的唯一方法是创建中间模型的实例
因此,与其分配相关的管理器,不如自己创建新的中间对象:
def duplicate(self, request, queryset):
for obj in queryset:
old_workedat = list(obj.workedat_set.all())
obj.id = None
obj.name += ' (copy)'
obj.save()
new_workedat = [WorkedAt(circus_id=obj.id, clown_id=wa.clown_id)
for wa in old_workedat]
WorkedAt.objects.bulk_create(new_workedat)
哦,这是有道理的。谢谢
def duplicate(self, request, queryset):
for obj in queryset:
old_workedat = list(obj.workedat_set.all())
obj.id = None
obj.name += ' (copy)'
obj.save()
new_workedat = [WorkedAt(circus_id=obj.id, clown_id=wa.clown_id)
for wa in old_workedat]
WorkedAt.objects.bulk_create(new_workedat)