Django-如何复制使用m2m字段和直通模型的模型实例

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=

我正在尝试编写一个管理操作来复制下面的Circus模型

到目前为止,我的代码的问题是,当我尝试运行它时,会出现如下错误:

无法在指定中介的ManyToManyField上设置值 模型

以下是我的模型:

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)