从FileSystemStorag访问模型

2024-10-03 23:21:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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'))

但在本例中,Django本身作为参数传递模型.CharField(很明显:)。
问题是:如何从存储访问模型实例?

提前谢谢!你知道吗


Tags: name模型imageselfnoneurlbase参数
1条回答
网友
1楼 · 发布于 2024-10-03 23:21:51

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

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_instance.storage.filename = self.name,甚至不需要向自定义存储类添加方法来更新文件名。你知道吗

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

希望这有帮助!你知道吗

相关问题 更多 >