为什么当我们改变FileField的存储属性时,django会创建一个迁移文件,而存储类型不是存储在数据库中的?

问题描述 投票:0回答:3

我不想在每次更改 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)
django django-models django-migrations
3个回答
9
投票

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 将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 这是唯一的方法 正确地重建一个字段就是让所有的变化都发生在 历史记录,在某些数据迁移中您可能需要这些选项 稍后(例如,如果您设置了自定义验证器)。


0
投票

这是我为视频上传实现的一个简单解决方案,可以使用不同的存储来上传。

实现一个存储类,充当实际存储实现的包装器:

@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
为文件选择不同的存储时,都不会生成迁移。

附注更改为新存储后,您将进行一次迁移,但仅此而已。


-1
投票

这是我对你的问题的解释 - 你想使用settings.py中指定的存储类(将来可以更改)来存储文件。

假设您在 settings.py 中指定 xyz 存储类并运行 makemigrations。 Django 将创建一个迁移文件,其存储属性与您在 settings.py 中指定的属性相同。

现在,如果您更改 settings.py 中的存储类别并且不运行 makemigrations 并上传文件,即使您不运行 makemigrations,您的文件也会上传到您在设置文件中指定的新存储。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.