copy.copy (object) возвращает объект с id == None во время тестов? - PullRequest
0 голосов
/ 13 февраля 2011

Я новичок в Django и Python, создаю свое первое приложение с использованием TDD ... Я хотел скопировать экземпляр Task, объект модели.Я использовал следующий код, который корректно работает во время тестов:

import copy

class Task(models.Model): 
    ...
    def make_copy(self):
       new_task = copy.copy(self)
       new_task.save()
       return new_task

Но при запуске этого кода «нормально» на сервере я заметил, что он не работает: новый объект не был создан.Я обнаружил, что должен был добавить new_task.id = None непосредственно перед сохранением, и я понимаю причину этого ...

Но если copy.copy не знает о Django и, следовательно, не изменит сам idПочему в ходе тестов возвращаемый объект имеет id == None?

1 Ответ

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

Похоже, ваш тестовый пример не полностью соответствует использованию в вашем "нормальном" сценарии использования.

Поле id установлено для объектов, которые существуют в базе данных.Если вы передадите методу make_copy() объект с установленным id, он, похоже, потерпит неудачу, потому что он не создает новый объект базы данных, он просто сохраняет существующий объект (через копию Python с существующим id).

Я предполагаю, что ваш тестовый пример передает Task объекты в make_copy() с id, равным None (и, следовательно, , кажущийся для работы), в то время как при "нормальном" использованииобъекты входят с установленным id.(Вы можете проверить эту гипотезу с помощью простого оператора print или assert.)

Одним простым решением может быть установка id в None сразу после операции копирования.Таким образом, всегда создается новый объект базы данных.

Наконец, кто-то еще с такой же ситуацией: http://www.nerdydork.com/copy-model-object-in-django.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...