В чем смысл использования свойств вместо полей в файловой модели 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

Это связано с тем, что расширение не хранится вместе с моделью, а фактически является вычисляемым свойством.

Мой вопрос: в чем причина того, что эти метаданные не хранятся в файловой модели.

Обновление: я не жалуюсь на реализацию. Прошу возможную мотивацию реализации.


person itsafire    schedule 05.12.2017    source источник
comment
Кажется, это вопрос о дизайнерском решении в конкретной сторонней библиотеке. Почему бы вам не спросить авторов этой библиотеки?   -  person Daniel Roseman    schedule 05.12.2017
comment
Я спрашиваю об этом, потому что это показывает некоторый стиль программирования. Django ORM — очень мощный инструмент. Поэтому, когда я вижу закономерности использования технологии, которую не могу разобрать, я просто спрашиваю. Разве это не основная идея stackoverflow?   -  person itsafire    schedule 05.12.2017


Ответы (1)


Расширение не очень важная мета, так как мы сохраняем имя файла. Если вы посмотрите на исходный код:

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

Вы можете видеть, что расширение хранения означает, что мы дублируем данные, которые у нас уже есть. Отсюда и решение сделать его собственностью.

person SomeTypeFoo    schedule 05.12.2017