Python 从文件系统存储访问模型

Python 从文件系统存储访问模型,python,django,Python,Django,我有自定义文件系统存储。 其思想是传递可选的文件名参数。 我的客户存储代码: class SalesMapFileStores(FileSystemStorage): def __init__(self, location=None, base_url=None, filename=None): if filename: self.filename = filename super(SalesMapFileStores, self)

我有自定义文件系统存储。
其思想是传递可选的文件名参数。
我的客户存储代码:

class SalesMapFileStores(FileSystemStorage):
    def __init__(self, location=None, base_url=None, filename=None):
        if filename:
            self.filename = filename
        super(SalesMapFileStores, self).__init__(location=location, base_url=base_url)

    def get_available_name(self, name):
        return name

    def get_valid_name(self, name):
        if self.filename:
            return self.filename
        return name

    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(SalesMapFileStores, self)._save(name, conten
我要做的是从模型中传递这个文件名参数。
像这样的事情:

class SalesMapImage(models.Model):
    name = models.CharField(max_length=254, verbose_name='Filename')
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(filename=name), verbose_name='Test Image',
                               content_types=('image/jpeg', 'image/png'))
class SalesMapImage(models.Model):
    name = models.CharField(max_length=254, verbose_name='Filename')
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(), verbose_name='Test Image',
                               content_types=('image/jpeg', 'image/png'))

    def __setattr__(self, key, value):
        self.__dict__[key]=value
        if key=='name':
            self.image.storage.filename = value
但在本例中,Django本身作为参数model.CharField传递(很明显:)。
问题是:如何从存储中访问模型实例?


提前谢谢

这个想法有点疯狂,但您可以尝试覆盖该类中对该字段的赋值,以便
salesmappfilestores
实例始终与
name
字段保持同步,如下所示:

class SalesMapImage(models.Model):
    name = models.CharField(max_length=254, verbose_name='Filename')
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(filename=name), verbose_name='Test Image',
                               content_types=('image/jpeg', 'image/png'))
class SalesMapImage(models.Model):
    name = models.CharField(max_length=254, verbose_name='Filename')
    image = SalesMapImageField(upload_to='SalesMap/Test', storage=SalesMapFileStores(), verbose_name='Test Image',
                               content_types=('image/jpeg', 'image/png'))

    def __setattr__(self, key, value):
        self.__dict__[key]=value
        if key=='name':
            self.image.storage.filename = value
一般的想法是将值的赋值与文件名字段的更新挂钩

这是假设您不想从视图中手动更新它。因为执行
model\u instance.storage.filename=self.name
甚至向自定义存储类添加方法来更新文件名都不需要太多的工作

更新:前往
storage=salesmappfilestores()
。您正在传递一个
salesmappfilestores
的实例。不是类,因此您可能会使用相同的Instance来存储所有文件,这与
filename
冲突。您可以这样尝试:
storage=salesmappfilestores

希望这有帮助