В моей модели Django у меня есть два поля:name
(обычныйCharField
)и slug
, настраиваемое поле, которое генерирует слаг на основе имени поля, переданного в определении поля, в этом случае я использую для этого name
.
Во-первых, в модели было только поле name
с соответствующими миграциями и всем остальным. Затем мне нужно было добавить поле slug
, поэтому, следуя соглашениям South, я добавил поле slug с unique=False
, создал миграцию схемы, затем создал миграцию данных, установил unique=True
и создал другую миграцию для этого последнего изменения..
Поскольку значение slug генерируется при сохранении модели, в методе миграции данных forwards
я перебирал набор запросов, возвращаемый orm['myapp.MyModel'].objects.all()
, и вызывал метод save()
для каждого экземпляра.
Но значение поля slug никогда не генерируется. В сеансе IPython я сделал то же самое, но сослался на модель как from myapp.models import MyModel
и сработал. Используя некоторые операторы отладки, печать type
модели, возвращенной South orm dict, показывает реальный класс, это не похоже на поддельную модель, созданную South на лету.
Поле slug создает свое значение при использовании метода pre_save
. Как заставить его вызываться во время переноса данных? Мне нужно обеспечить уникальность значения, поэтому, когда индекс применяется в более поздней миграции схемы, столбцы не содержат повторяющихся значений.
Спасибо!
Кстати, :Класс поля slug действительно определяет south_field_triple
, поэтому Юг хорошо с ним справляется.
РЕДАКТИРОВАТЬ:См. мой ответ . Но больше похоже на ответ, это больше похоже на взлом. Есть ли лучший/правильный способ сделать это?