Миграция ссылок на динамическое хранилище несовместима - PullRequest
2 голосов
/ 11 июня 2019

Я хочу, чтобы конкретное поле в модели использовало либо хранилище S3 (если в настройках указано AWS_ACCESS_KEY_ID), либо откат до default_storage. Я использую django-storages.

Чтобы реализовать это, в models.py:

from django.db import models
from django.conf import settings
from .storage_backends import variativeStorage

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='/public', default='dummy-img.png', storage=variativeStorage())

storage_backends.py:

from storages.backends.s3boto3 import S3Boto3Storage
from django.core.files.storage import default_storage
from django.conf import settings


def variativeStorage():
    """Return S3Boto3Storage if access key is defined.
    Fallback to default storage.
    """
    if hasattr(settings, 'AWS_ACCESS_KEY_ID') and settings.AWS_ACCESS_KEY_ID:
        return S3Boto3Storage()
    return default_storage

Отлично работает, но проблема в миграциях - он оценивает поле storage, в котором находятся настройки django. Так что в случае, если у нас нет AWS_ACCESS_KEY_ID, makemigrations сделает:

operations = [
        migrations.AlterField(
            model_name='profile',
            name='photo',
            field=models.ImageField(default='dummy-img.png', upload_to='/public'),
        ),
    ]

и в случае, если оно имеет:

operations = [
        migrations.AlterField(
            model_name='profile',
            name='photo',
            field=models.ImageField(default='dummy-img.png', storage=storages.backends.s3boto3.S3Boto3Storage(), upload_to='/public'),
        ),
    ]

Таким образом, запуск сервера в рабочей среде вызовет предупреждение о пропущенных миграциях:

remote: Running migrations:
remote: No migrations to apply.
remote: Your models have changes that are not yet reflected in a migration, and so won't be applied.
remote: Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Существует ли согласованный способ создания динамического хранилища для полей? Как я могу выполнить отложенную оценку variativeStorage или, возможно, удалить генерацию миграции для этого конкретного поля?

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