2014-09-30 3 views
0

При копировании объекта модели Django я всегда ожидал, что он не будет иметь идентичную идентификацию (также известный как первичный ключ) как исходный объект, с которого я копирую. Обычно вы делаете что-то вроде этого:Переопределение __copy__ для моделей Django?

copy = copy.copy(source) 
copy.pk = None 
copy.save() 

Но я хотел бы сделать это автоматический, как это:

class MyModel(Model): 
    def __copy__(self): 
     result = MyModel.__new__(MyModel) 
     result.__dict__.update(self.__dict__) 
     result.pk = None 
     return result 

Так что теперь я просто не могу сделать:

copy.copy(my_Model).save() 

До сих пор это кажется работать. Однако, глядя на то, что Django делает с объектами модели в __init__ и __new__, например, я продолжаю задаваться вопросом, действительно ли это разрешено и соответствует принципам Django. Удивительно, что модели Django, похоже, не переопределяют __copy__.

+0

Спасибо, matsjoyce, не знал. –

ответ

0

Как вы можете найти в Django source (Model.__hash__), Django просто использует метод __hash__ (который использует pk) для определения хэша для метода. Так что это не будет противоречить этому.

Кроме того, метод __eq__ также сравнивает pk, поэтому для него это не имеет значения.

Короче говоря, вам нечего останавливать от переопределения __copy__, если вы убедитесь, что значение pk изменено в процессе.

Смежные вопросы