从FileSystemStorage访问模型

时间:2013-05-18 12:33:15

标签: python django

我有自定义FileSystemStorage 想法是传递可选的文件名参数 我的客户storge代码:

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(它显而易见:))。
问题是:如何从存储中访问我的模型实例?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,这有点疯狂,但您可以尝试覆盖该类中该字段的分配,以便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

希望这有帮助!