Django动态模型.FileField存储

Has*_*ani 5 django django-models filefield

我有一个这样的模型:

\n\n
class Person(models.Model):\n    name = models.Charfield(max_length\xc2\xb6=30)\n    photo = models.FileField(upload_to='uploads/')\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有办法 根据字段的值动态更改Storage字段的类?photoname

\n\n

xxx例如,我想将姓名FileSystemStorage\xc2\xb6为我想要使用的其他人的照片存储起来S3Storage

\n

S.K*_*S.K 5

我也有类似的用例。使用模型字段动态更新存储object_storage_name。从文章https://medium.com/@hiteshgarg14/how-to-dynamically-select-storage-in-django-filefield-bc2e8f5883fd中汲取灵感,尝试了下面的代码

class MediaDocument(models.Model):
    object_storage_name = models.CharField(max_length=255, null=True)
    file = DynamicStorageFileField(upload_to=mediadocument_directory_path)


class DynamicStorageFieldFile(FieldFile):

    def __init__(self, instance, field, name):
        super(DynamicStorageFieldFile, self).__init__(
            instance, field, name
        )
        if instance.object_storage_name == "alibaba OSS":
            self.storage = AlibabaStorage()
        else:
            self.storage = MediaStorage()


class DynamicStorageFileField(models.FileField):
    attr_class = DynamicStorageFieldFile

    def pre_save(self, model_instance, add):
        if model_instance.object_storage_name == "alibaba OSS":
            storage = AlibabaStorage()
        else:
            storage = MediaStorage()
        self.storage = storage
        model_instance.file.storage = storage
        file = super(DynamicStorageFileField, self
                     ).pre_save(model_instance, add)
        return file
Run Code Online (Sandbox Code Playgroud)

效果很好。


Sha*_*kil 0

是的,您可以为某些特定文件指定自定义上传位置。

\n\n
def my_upload_function(instance, filename):\n    if instance.name === your_name:\n        return your_location\n\n    return generic_location\n\n\nclass Person(models.Model):\n    name = models.Charfield(max_length\xc2\xb6=30)\n    photo = models.FileField(upload_to=my_upload_function)\n
Run Code Online (Sandbox Code Playgroud)\n