Python 迁移引用动态存储不一致
我希望模型中的特定字段使用S3存储(如果设置具有Python 迁移引用动态存储不一致,python,django,django-storage,Python,Django,Django Storage,我希望模型中的特定字段使用S3存储(如果设置具有AWS\u访问\u密钥\u ID)或回退到default\u存储。我正在使用django存储 要实现这一点,请在models.py中: 来自django.db导入模型的 从django.conf导入设置 from.storage\u后端导入变量存储 类配置文件(models.Model): user=models.OneToOneField(settings.AUTH\u user\u MODEL,on\u delete=models.CASCAD
AWS\u访问\u密钥\u ID
)或回退到default\u存储
。我正在使用django存储
要实现这一点,请在models.py中:
来自django.db导入模型的
从django.conf导入设置
from.storage\u后端导入变量存储
类配置文件(models.Model):
user=models.OneToOneField(settings.AUTH\u user\u MODEL,on\u delete=models.CASCADE)
photo=models.ImageField(上传到='/public',默认值为='dummy-img.png',存储=variativeStorage())
storage_backends.py:
从storages.backends.s3boto3导入s3boto3存储
从django.core.files.storage导入默认存储
从django.conf导入设置
def variativeStorage():
“”“如果定义了访问密钥,则返回S3BOTO3存储。”。
回退到默认存储。
"""
如果hasattr(设置,“AWS\u访问密钥\u ID”)和settings.AWS\u访问密钥\u ID:
返回S3boto3存储()
返回默认存储
它工作得很好,但问题是在迁移中—它评估当前使用的django设置的字段存储。因此,如果我们没有AWS\u访问权\u密钥\u 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
进行延迟评估,或者删除该特定字段的迁移生成?找到答案了吗?@cristianocelho no。坦白地说,经过几天的尝试,我在生产服务器上弹出了警告。