2015-09-15 19 views
6

私のDjango 1.8アプリは、モデルにImageFieldが含まれているサードパーティのアプリ(django-avatar)を使用しています。私はまた、私のプロジェクトのsettings.pyでカスタムDEFAULT_FILE_STORAGE(S3BotoStorage django-storages-redux)を使用しています。その結果、私はmanage.py migrateを実行するたびに、私はアバターアプリについては、この警告を受ける:Djangoの "マイグレーションに反映されない変更" ImageFieldとカスタムストレージ

あなたのモデルがまだ移行に反映されていない変更があり、そのため適用されません。 'manage.py makemigrations'を実行して新しい移行を行い、 'manage.py migrate'を再度実行して移行します。

... avatar's initial migrationは、DjangoのデフォルトのFileSystemStorageを参照しています。 makemigrationsを実行すると、そののImageFieldのストレージが私のプロジェクトの設定を一致させるために、アバターアプリで新しい0002の移行を作成します。

問題は、この新しい移行は、私のプロジェクトの外に、Pythonのサイトのパッケージ内に設置アバターで作成され
... 
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のコントロールの外側に、展開のために利用できないなど)。

カスタムDEFAULT_FILE_STORAGEのプロジェクトでImageField(またはFileField)を使用するサードパーティ製アプリケーションの移行を処理する正しい方法は何ですか?私は考えました:

  • 警告を無視してください。ストレージを移行するための移行は実際には ではDBスキーマには影響しません。私のプロジェクトのDEFAULT_FILE_STORAGEは最初から S3BotoStorageになっているので、データの移行は必要ありません。

  • settings.MIGRATION_MODULESを使用して、アバターの マイグレーションを自分のプロジェクトに移動します。 (私のコピーへのすべての将来の アバターの移行を超えるそして慎重ポート - エラーが発生しやすいようです。) [EDIT: ジャンゴ - ユーザーのthis commentメーリングリストが、これは間違ったアプローチであることを示唆している。]

  • 掲載django-avatar(またはdjango-storage-redux)のメンテナーは何を変更するのですか? (現在、S3BotoStorageは既にdeconstructibleです。これは問題ではありません)

  • または...?

+0

ちょっとmedmunds、私は現在django-avatarのメンテナーです。私はこれに対する答えも知りたいと思います。 ImageField.storage'属性を 'settings.AVATAR_STORAGE'を参照するように変更する別の移行を作成すると、これを防ぐことができると思いますか? – grantmcconnaughey

+0

こんにちは、グラント、パッケージのおかげで!ですから、あなたはdjango-avatarにスキーマ移行を追加し、手動で 'storage = get_storage_class(s​​ettings.AVATAR_STORAGE)()'のようなものを編集しますか?私はそれが私の問題を解決するかもしれないと思うが、あなたは同じ方法ですべての将来のdjango-avatar schemamigrationを編集することを忘れてはならない。また、マイグレーション時に状態をフリーズすることもないため、実際にあるストレージから別のストレージに移行しようとする人には問題が生じる可能性があります。 – medmunds

+0

Djangoトラッカー([22373](https://code.djangoproject.com/ticket/22373)と[22337](https://code.djangoproject.com/ticket/22337))には移行と保存に関する議論がありますが、 )、サードパーティのアプリケーションのコンテキストではそれのどれも。それ以上の問題を提起するのに役立つのだろうか? – medmunds

答えて

1

答えは... django-avatarの保守担当者に修正を依頼してください。

単にデフォルトのストレージを使用する場合は、Noneまたはdjango.core.files.storage.default_storageImageFieldを渡す必要があります。この場合、storage kwargは移行のフィールドに渡されません。

これを修正するためにPRを作成しました。

+0

ニース: '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の既存の移行を変更しましたが、これが正しいアプローチかどうかはわかりません。 –

関連する問題