2015-09-15 7 views
6

Приложение Django 1.8 использует стороннее приложение (django-avatar), чья модель содержит ImageField. Я также использую пользовательский DEFAULT_FILE_STORAGE (S3BotoStorage от django-storages-redux) в настройках моего проекта.py. В результате, каждый раз, когда я бегу manage.py migrate, я получаю это предупреждение о приложении аватара:Django «изменения не отражены в миграции» с ImageField и настраиваемым хранилищем

Ваши модели имеют изменения, которые еще не отражены в миграции, и поэтому не будет применяться. Запустите «manage.py makemigrations», чтобы выполнить новые миграции, а затем повторно запустите «manage.py migrate», чтобы применить их.

... потому что avatar's initial migration ссылки Django по умолчанию FileSystemStorage. Запуск makemigrations создает новую 0002 миграцию в приложении аватар, чтобы сделать хранение своего Imagefield в соответствии с моей настройкой проекта:

... 
migrations.AlterField(
    model_name='avatar', 
    name='avatar', 
    field=models.ImageField(storage=storages.backends.s3boto.S3BotoStorage(), max_length=1024, upload_to=avatar.models.avatar_file_path, blank=True), 
), 

Проблема эта новая миграция создаются в аватаре, установленном на сайте-пакетах питона, вне моего проекта (так что внешний контроль git, недоступный для развертывания и т. д.).

Каков правильный способ обработки миграции для стороннего приложения, которое использует ImageField (или FileField) в проекте с пользовательским DEFAULT_FILE_STORAGE? Я рассмотрел:

  • Просто игнорируйте предупреждение. Переход на изменение хранилища фактически не влияет на схему DB , и поскольку DEFAULT_FILE_STORAGE моего проекта был S3BotoStorage с самого начала, миграция данных не требуется.

  • Использование settings.MIGRATION_MODULES для перемещения аватаров миграции в мой проект. (А затем тщательно порт над каждой будущей миграцией аватара моего экземпляра - который, кажется, подвержены ошибкам.) [EDIT:. this comment на Джанго-пользователей в списке рассылки предполагает, что это неправильный подход]

  • Спросит django-avatar (или django-storages-redux), чтобы изменить ... что? (BTW, S3BotoStorage уже deconstructible - это не проблема.)

  • Или ...?

+0

Эй, медиум, я постоянный помощник джанго-аватара, и я также хотел бы узнать ответ на этот вопрос. Считаете ли вы, что создание другой миграции, которая изменяет атрибут 'ImageField.storage', для ссылки на' settings.AVATAR_STORAGE', помешает этому? – grantmcconnaughey

+0

Эй, Грант, спасибо за пакет! Итак, вы добавили бы миграцию схемы в django-avatar и вручную отредактировали ее, чтобы иметь что-то вроде 'storage = get_storage_class (settings.AVATAR_STORAGE)()'?Я думаю, что это может решить мою проблему, но вам придется не забывать редактировать каждый будущий django-аватар схемы так же. Кроме того, это может вызвать проблемы для людей, которые действительно пытаются перенести из одного хранилища в другое, потому что это не будет замораживать состояние во время миграции (возможно - не уверен в этом). – medmunds

+0

Обсуждается миграция и хранение в трекер Django ([22373] (https://code.djangoproject.com/ticket/22373) и [22337] (https://code.djangoproject.com/ticket/22337)), но ни один из них в контексте сторонних приложений. Интересно, поможет ли это поднять вопрос? – medmunds

ответ

1

Ответ на этот вопрос ... Попросите, чтобы помощники django-аватара исправили это.

Если вы хотите просто использовать хранилище по умолчанию, вы должны пройти None или django.core.files.storage.default_storage до ImageField. В этом случае storage kwarg не будет передано в поле в процессе миграции.

Я создал PR, чтобы исправить это.

+0

Nice: 'default_storage' - не знал об этом. Не будет ли django-avatar теперь также нуждаться в новой миграции, чтобы переопределить явную ссылку на 'django.core.files.storage.FileSystemStorage()' в своей [начальной миграции] (https://github.com/grantmcconnaughey/django- аватар/BLOB/2.1.1/аватар/миграция/0001_initial.py # L23)? – medmunds

+0

@medmunds Я только что изменил существующую миграцию в PR, однако я не уверен, что это правильный подход / –