2015-09-20 3 views
1

У меня есть модель, которая имеет поле URLField, и мне нужно сделать миграцию, которая превращает это поле в внешний ключ, где строка является уникальным полем другого объекта и , если объект не существует, создайте его.django migrate from URLField для внешнего ключа без юга

, например, превратить это:

class Event_UserVisit(Event_Base): 
    dest_url = models.URLField(max_length=1000) 

в этом:

class Event_UserVisit(Event_Base): 
    dest_url = models.ForeignKey(Page) 

Я никогда не делал ручной миграции, как это и не нашел учебник или инструкции, чтобы сделать что-то вроде это.

очевидно проделывают наивные ошибки обратной миграции, как это:

django.db.utils.ProgrammingError: column "source_url_id" cannot be cast automatically to type integer 

что самый лучший подход, чтобы сделать это?

примечание: мне нужно сделать это на производственной базе данных с большим количеством данных, поэтому я не могу долгое время простоя и не могу потерять данные.

спасибо! :)

+0

Какую версию Django вы используете? syncdb был «устарел» и заменен мигрированием в Django версии 1.7+. Рекомендуется использовать собственный встроенный инструмент миграции Django на юг. Оба созданы Эндрю Годвином. https://docs.djangoproject.com/en/1.8/topics/migrations/ –

+0

1.8, но я использую migrate, а не syncdb, без юга. Я думаю, что проблема законна, например, это не то, что я делаю неправильно с django, это просто то, что я не знаю, как делать с django. Это не тривиальная миграция для преобразования поля URL в внешний ключ существующих/новых объектов. спасибо :) –

ответ

1

Я не думаю, что вы можете сделать это на уровне ORM за один раз (если только кто-то не исправил меня). Вам нужно будет создать новый FK, возможно, выполнить прогоны миграции, а затем написать сценарий для переноса данных. Затем удалите dest_url снова запущенные миграции. Затем переименуйте dest_url2 в dest_url Здесь Django обнаружит изменение имени.

Однако, я не понимаю, почему вы связываете FK ID на странице с полем dest_url. PK на странице не должен быть 1000 максимальным URL! Он не имеет порядка и сделает индексирование жестким и замедлит ваше приложение. Было бы больше смысла действительно есть ...

class Event_UserVisit(Event_Base): 
    page = models.ForeignKey(Page, related_name='eventvisits') 

Я предполагаю, что страница будет выглядеть примерно так ...

class Page(models.Model): 
    dest_url = models.URLField(max_length=1000) 
+1

привет Глин Джексон, к тому времени, как вы ответили, я уже очень много сделал, что вы предложили, поэтому я рад видеть, что я принял правильный подход. о вещи PK - я сказал «первичный ключ», просто чтобы это было просто, но на самом деле это не ПК, а просто уникальное поле. Страницы по-прежнему используют встроенное целочисленное значение PK. ;) независимо, +1 для большого наконечника. –