Клонировать объект с Джанго - PullRequest
1 голос
/ 11 февраля 2011

У меня есть модель, которую можно описать как:

Элемент: - элемент имеет одно-одно поле с ElementData

ElementData: - он имеет ForeignKey для ElementImage - который описывает изображение по умолчанию

ElementImage: - он имеет ForeignKey для ElementData

ElementVideo: - он имеет внешний ключ к ElementData

Теперь я хочу, чтобы элемент и все подтаблицы были клонированы. Я попытался использовать фрагмент, который я нашел здесь . Я помещаю эту функцию в Element и ElementData, и когда я в элементе пытаюсь клонировать ElementData, у меня нарушается ограничение Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Поскольку Element имеет отношение OneToOne к ElementData, необходимо клонировать ElementData перед клонированием Element.Как это:

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 голос
/ 11 февраля 2011

мое решение:

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)

Пожалуйста, напишите, что вы думаете об этом

...