将文件上传到django中的相同随机文件夹

时间:2017-11-13 22:31:32

标签: python django django-rest-framework

我使用django rest框架上传两个文件,我想将这两个文件上传到同一个文件夹中并使用随机名称创建所述文件夹。

到目前为止,我可以使用以下内容将这两个文件上传到不同的随机文件夹:

from uuid import uuid4

def path_and_rename(path, dataset):
    def wrapper(instance, filename):
        main_folder = '{}/{}/'.format(path, uuid4().hex)
        name = '{}.csv'.format(dataset)

        return os.path.join(main_folder, name)
    return wrapper


class Dataset(Model):
    trainFile = FileField(null=False, blank=False,
                      validators=[FileExtensionValidator(['csv'])],
                      upload_to=path_and_rename('files/', 'train'))
    testFile = FileField(null=False, blank=False,
                     validators=[FileExtensionValidator(['csv'])],
                     upload_to=path_and_rename('files/', 'test'))


class DatasetSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Dataset
        fields = (
            'id',
            'trainFile',
            'testFile',
        )
        read_only_fields = ('created',)

我怎样才能将这两个文件上传到同一个随机文件夹?

2 个答案:

答案 0 :(得分:0)

由于需要第一个FileField并且字段将按顺序上传,因此除了依赖于初始上传路径的第一个字段之外,您可以为所有字段使用备用upload_to函数。类似的东西:

import posixpath

def dataset_file(dataset):
    def wrapper(instance, filename):
        main_folder = posixpath.split(instance.trainFile)[0]
        name = '{}.csv'.format(dataset)
        return posixpath.join(main_folder, name)
    return wrapper

```

答案 1 :(得分:0)

您正在两个不同的场合调用path_to_rename(),然后依次调用uuid4(),这样您就可以获得两个随机的UUID。作为旁注,为了更好的代码可读性,您的“包装器”应该是外部函数。

尝试:

def upload_to_wrapper(upload_dir, dataset):
    def path_and_rename(instance, filename):
        return os.path.join(upload_dir, '{}.csv'.format(dataset))
    return path_and_rename


class Dataset(Model):
    upload_dir = 'files/{}'.format(uuid4().hex)
    trainFile = FileField(null=False, blank=False,
                          validators=[FileExtensionValidator(['csv'])],
                          upload_to=upload_to_wrapper(upload_dir, 'train'))
    testFile = FileField(null=False, blank=False,
                         validators=[FileExtensionValidator(['csv'])],
                         upload_to=upload_to_wrapper(upload_dir, 'test'))