Django Custom File Storage system

后端 未结 3 1031
我寻月下人不归
我寻月下人不归 2021-02-08 17:38

I have a custom storage

import os
from django.core.files.storage import Storage


class AlwaysOverwriteFileSystemStorage(Storage):
    def get_available_name(sel         


        
相关标签:
3条回答
  • 2021-02-08 18:07

    I try to make this, but don`t work for me, until I make this on my storage.py :

    import os
    from django.conf import settings
    from django.core.files.storage import FileSystemStorage
    
    
    class MyFileSystemStorage(FileSystemStorage):
        def get_available_name(self, name, *args, **kwargs):
            if self.exists(name):
                os.remove(os.path.join(settings.MEDIA_ROOT, name))
            return super().get_available_name(name, *args, **kwargs)
    

    No other changes was required.

    Another way yo do this:

    from django.core.files.storage import FileSystemStorage
    
    class AvatarStorage(FileSystemStorage):
    
        def get_available_name(self, name, *args, **kwargs):
            self.delete(name)
            return super().get_available_name(name, *args, **kwargs)
    

    The delete method check if the file exists. So these 3 line are enough. I hope this help somebody

    0 讨论(0)
  • 2021-02-08 18:11

    You don't need to put anything in your settings.py. Just use it directly in your model. For example, create storage.py wherever your app is located and put OverwriteStorage() in it. Then, your model could look like this:

    from storage import OverwriteStorage
    ...
    class MyModel(models.Model):
        ...
        image = ImageField(upload_to='images', storage=OverwriteStorage())
    

    I am also using a custom storage system to overwrite existing files. My storage.py looks like this:

    from django.core.files.storage import FileSystemStorage
    
    class OverwriteStorage(FileSystemStorage):
        """
        Returns same name for existing file and deletes existing file on save.
        """                                                              
        def _save(self, name, content):
            if self.exists(name):
                self.delete(name)
            return super(OverwriteStorage, self)._save(name, content)
    
        def get_available_name(self, name):
            return name
    
    0 讨论(0)
  • 2021-02-08 18:19

    You can put it anywhere, but you should point the path to there in the settings.py

    You can put this storage.py file in the root folder (the one that has manage.py) and point the path as storage.AlwaysOverwriteFileSystemStorage

    0 讨论(0)
提交回复
热议问题