我不想在每次更改 FileField 的存储时创建迁移文件。我从 settings.py 获取存储类,它是可配置的。
设置.py
Storage = S3BotoStorage(bucket='example')
模型.py
from django.conf import settings
class myModel(models.Model):
file = models.FileField(upload_to='', blank=True, storage=settings.Storage)
TLDR:这是一个空的迁移,它是无害的,让它继续阅读或尝试不同的东西可能只是浪费时间
每当你对模型进行更改时,django 都必须进行迁移,因为它需要跟踪模型随时间的变化。然而,这并不总是意味着将在数据库中进行修改。这里产生的迁移是一个空迁移。您的迁移可能看起来像这样,您会说,干草不是空的!!
class Migration(migrations.Migration):
dependencies = [
('stackoverflow', '0010_jsonmodel'),
]
operations = [
migrations.AlterField(
model_name='jsonmodel',
name='jfield',
field=stackoverflow.models.MyJsonField(),
),
migrations.AlterField(
model_name='parent',
name='picture',
field=models.ImageField(storage=b'Bada', upload_to=b'/home/'),
),
]
但确实如此!!就做吧
./manage.py sqlmigrate <myapp> <migration_number>
并且你会发现它不会产生任何SQL!根据@sayse的建议引用手册
Django 将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 这是唯一的方法 正确地重建一个字段就是让所有的变化都发生在 历史记录,在某些数据迁移中您可能需要这些选项 稍后(例如,如果您设置了自定义验证器)。
这是我为视频上传实现的一个简单解决方案,可以使用不同的存储来上传。
实现一个存储类,充当实际存储实现的包装器:
@deconstructible(path="travel.apps.vod.models.VideoStorage")
class VideoStorage:
def __init__(self):
self.storage = storages[settings.VOD_STORAGE]
def __getattr__(self, item):
return getattr(self.storage, item)
如果你愿意,你可以继承
Storage
类,但是你需要重写所有的存储方法并调用。
在您的设置中定义不同的存储类别(这部分取决于您如何处理)
STORAGES = {
'default': {
'BACKEND': self.DEFAULT_STORAGE_CLASS,
},
'staticfiles': {
'BACKEND': 'travel.core.storage.CompressedManifestStaticFilesStorage',
},
'local': {
'BACKEND': 'django.core.files.storage.FileSystemStorage',
},
's3': {
'BACKEND': 'storages.backends.s3.S3Storage',
},
}
VOD_STORAGE = 's3'
现在,每当您更改
VOD_STORAGE
为文件选择不同的存储时,都不会生成迁移。
附注更改为新存储后,您将进行一次迁移,但仅此而已。
这是我对你的问题的解释 - 你想使用settings.py中指定的存储类(将来可以更改)来存储文件。
假设您在 settings.py 中指定 xyz 存储类并运行 makemigrations。 Django 将创建一个迁移文件,其存储属性与您在 settings.py 中指定的属性相同。
现在,如果您更改 settings.py 中的存储类别并且不运行 makemigrations 并上传文件,即使您不运行 makemigrations,您的文件也会上传到您在设置文件中指定的新存储。
希望有帮助。