如何在迁移中使用Django FileStorage位置的相对路径?

qxgroojn  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(189)

我正在定义一个包含FileField的Model,由于不相关的原因,无法将该FileField应该包含的文件保存在媒体文件夹中。因此,我需要定义一个保存到不同Path中的FileStorage。当在我的模型中定义该FileStorage并从我的django设置中传递DJANGO_ROOT变量来构建我的位置路径时,一旦我为我的模型生成了迁移,这就被解析为系统特定的路径。因为路径现在特定于我的开发目录,我无法在所有生产服务器上应用生成的迁移文件,而且在所有生产服务器上生成迁移显然不是一种选择。我也尝试过编辑自动生成的迁移本身的路径,使其依赖于django的设置。可悲的是,manage.pymigrate命令告诉我,它希望为该模型生成新的迁移。我如何传递一个相对路径到我的FileStorage位置,允许我为生产服务器生成迁移?我的模型:

class ModelWithFile(models.Model):
    file = models.FileField(
        storage=FileSystemStorage(location=os.path.join(settings.DJANGO_ROOT, "folder_name"),
        verbose_name=_("FileObject"),
    )

自动生成迁移:

from django.db import migrations, models
from django.conf import settings
import django.core.files.storage

class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='ModelWithFile',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('file', models.FileField(upload_to=b'', storage=django.core.files.storage.FileSystemStorage(base_url=None, location='/home/myusername/repros/thisrepro/folder_name/'), verbose_name='File')),
            ],
            options={
                'verbose_name': 'Model With File',
            },
        ),
]

我尝试通过os.path.join(settings.DJANGO_ROOT,“folder_thats_not_media”)作为我的位置。
我希望自动生成的迁移使用与设置中定义的相同的相对路径
我遇到了什么问题?自动生成的迁移中的位置路径被解析为系统特定路径

ryevplcw

ryevplcw1#

听起来你在处理两个问题。第一个:
在django FileField上使用upload_to参数:
https://docs.djangoproject.com/en/4.1/ref/models/fields/#django.db.models.FileField.upload_to
该函数输入示例和文件名,但您也可以导入设置以增加灵活性。例如:

def file_upload_path(instance, filename):
    prefix = f'{instance.id}:{instance.__class__.__name__}'
    return os.path.join(f'logos/{prefix}', filename)

class ModelWithFile(models.Model):
    file = models.FileField(storage=FileSystemStorage(), upload_to=file_upload_path)

至于读取迁移脚本中的位置,听起来像是在寻找django.apps:

In [1]: from django.apps import apps as django_apps                                                                                                                                                         
In [2]: app_config = django_apps.get_app_config('appname')                                                                                                                                                 
In [3]: app_path = app_config.path

从这一点上,您可以使用OS lib从应用程序位置到达您需要到达的位置。
更多文档可在此处找到:https://docs.djangoproject.com/en/4.1/ref/applications/

相关问题