Почему исходный объект django изменяется при клонировании? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу клонировать модель / объект django.Вот мой код с некоторыми операторами отладки (метод находится внутри моего класса Item)

def duplicate_item(self):
    print("original",self.id)
    copy = self
    copy.id = uuid.uuid4()
    print("copy",copy.id)
    copy.save()
    print("What happened",self.id)


Это был вывод:

original 6a5a8d54-5b45-47fd-abf3-4357aa89dd0c
copy 5b6bfb5f-36b2-4a74-968e-c1f007df9056
what happened 5b6bfb5f-36b2-4a74-968e-c1f007df9056

Почему это происходит?Я не знаю достаточно о логике мелкого / глубокого копирования python, так что, вероятно, это связано с ней.Спасибо

1 Ответ

0 голосов
/ 23 мая 2019

Как говорит @selcuk, здесь "Вы ничего не клонируете" . Вы можете использовать этот метод для клонирования вашего объекта.

Примечание: вы можете изменить pk на id, если ваш первичный ключ id

def duplicate_item(self):
    old_data = self.__dict__

    if 'pk' in old_data:
        del old_data['pk']

    if '_state' in old_data:
        del old_data['_state']

    new_object = self.__class__.objects.create(**old_data)
    return new_object

Но вы также можете изменить pk/id, используя uuid.uuid4()

def duplicate_item(self):
    old_data = self.__dict__
    old_data['pk'] = uuid.uuid4() # new id

    if '_state' in old_data:
        del old_data['_state']

    new_object = self.__class__.objects.create(**old_data)
    return new_object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...