用django克隆对象

时间:2011-02-11 08:23:37

标签: django django-models django-views

我有一个可以描述为的模型:

元素: - element具有ElementData

的一对一字段

elementData中: - 它具有到ElementImage的ForeignKey - 它描述了默认图像

ElementImage: - 它有ElementK的ForeignKey

ElementVideo: - 它对ElementData

有foreignKey

现在我希望克隆元素和所有子表。我尝试使用我发现here的代码段。我将此函数放到Element和ElementData中,当我在元素中尝试克隆ElementData时,我有约束违规。有人能帮助我吗?

2 个答案:

答案 0 :(得分:3)

因为Element与ElementData有OneToOne关系,所以在克隆Element之前需要克隆ElementData。像这样:

class Element(...):
    def clone(self):
        new_kwargs = dict([(fld.name, getattr(old, fld.name)) for fld in old._meta.fields if fld.name != 'id']);
        new_data = self.data.clone()
        new_kwargs['data'] = new_data
        return self.__class__.objects.create(**new_kwargs)

答案 1 :(得分:1)

我的解决方案:

def clone(self):
        old = self
        images = old.element_data.images.all()
        videos = old.element_data.videos.all()
        element_data = self.element_data
        element_data.id = None
        element_data.save()
        for image in images:
            image.id = None
            image.element_data = element_data
            image.save()
        for video in videos:
            video.id = None
            video.element_data = element_data
            video.save()

        new_kwargs = dict([(fld.name, getattr(old, fld.name)) for fld in old._meta.fields if fld.name != 'id']);
        new_kwargs['element_data'] = element_data
        return self.__class__.objects.create(**new_kwargs)

请写下您对此的看法