在django-filer的File模型中使用属性而不是字段的基本原理是什么

时间:2017-12-05 09:47:53

标签: python django django-filer

我尝试对扩展字段进行过滤,这实际上根本不是一个字段,如下例所示。为了这个例子,让我们假设我们有一个运行Django并安装了django-filer并且已经上传了一些文件。

>>> from filer.models import File
>>> File.objects.all()[0].extension
'some_ext' # just as example

但是在尝试过滤时:

>>> File.objects.filter(extension='pdf')
django.core.exceptions.FieldError: Cannot resolve keyword 'extension'
into field. Choices are: _file_size, clipboarditem, description, 
downloadfilemodel, file, filer_image_file, folder, folder_id, 
has_all_mandatory_data, id, in_clipboards, is_public, modified_at, 
name, news_attachment, original_filename, owner, owner_id, 
polymorphic_ctype, polymorphic_ctype_id, sha1, uploaded_at

这是因为扩展不与模型一起存储,但实际上是计算属性。

我的问题:不在文件模型中存储此元数据的理由是什么。

更新:我不抱怨实施。我要求实施的可能动机。

1 个答案:

答案 0 :(得分:1)

由于我们存储文件名,扩展名不是一个非常重要的元数据。如果你看一下source code

@property
def extension(self):
    filetype = os.path.splitext(self.file.name)[1].lower()
    if len(filetype) > 0:
        filetype = filetype[1:]
    return filetype

您可以看到存储扩展意味着我们正在复制我们已有的数据。因此决定将其作为财产。