Django dynamic models.FileField存储

Django dynamic models.FileField存储,django,django-models,filefield,Django,Django Models,Filefield,我有一个这样的模型: class Person(models.Model): name = models.Charfield(max_length¶=30) photo = models.FileField(upload_to='uploads/') 是否有任何方法可以根据名称字段的值动态更改照片字段的存储类 例如,我想将姓名为xxx的人的照片存储到FileSystemStorage中,对于其他我想使用S3Storage的人,您可以为某些特定文件指定自定义上载位置 def my

我有一个这样的模型:

class Person(models.Model):
    name = models.Charfield(max_length¶=30)
    photo = models.FileField(upload_to='uploads/')
是否有任何方法可以根据
名称
字段的值动态更改
照片
字段的
存储


例如,我想将姓名为
xxx
的人的照片存储到
FileSystemStorage
中,对于其他我想使用
S3Storage
的人,您可以为某些特定文件指定自定义上载位置

def my_upload_function(instance, filename):
    if instance.name === your_name:
        return your_location

    return generic_location


class Person(models.Model):
    name = models.Charfield(max_length¶=30)
    photo = models.FileField(upload_to=my_upload_function)

我也有一个类似的用例。使用模型字段
object\u storage\u name
动态更新存储。 从文章中获得灵感,尝试了下面的代码


工作正常。

谢谢,但我想更改存储类型。例如,一些文件必须存储在硬盘中,而其他文件则应存储在amazon s3 Bucket抱歉@HasanRamezani我不知道该怎么做。@HasanRamezani你能解决这个问题吗?我也有一个类似的用例。我找不到我该怎么做。
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