Как добавить пользовательский фильтр в дочернюю модель django? - PullRequest
0 голосов
/ 24 апреля 2020

Я довольно новичок в django, и я работаю над существующим приложением, которое я не писал. Приложение обрабатывает некоторые действия по управлению документами и всякий раз, когда отображается миниатюра документа, оно в настоящее время отображает все связанные метаданные. В моем случае некоторые строки метаданных являются нежелательными (руководства не очень удобны для человека), и поэтому я хочу исключить некоторые из метаданных.

Существуют в основном три таблицы, одна для документов, одна для типов метаданных и таблица соединений, которая связывает их вместе.

Внутренности таблицы соединения выглядят так:

class DocumentMetadata(models.Model):
    document = models.ForeignKey(
        on_delete=models.CASCADE, related_name='metadata', to=Document,
        verbose_name=_('Document')
    )
    metadata_type = models.ForeignKey(
        on_delete=models.CASCADE, to=MetadataType, verbose_name=_('Type')
    )
    value = models.CharField(
        blank=True, db_index=True, 
        ), max_length=255, null=True, verbose_name=_('Value')
    )    

Текущий код делает это при создании эскиза:

queryset=context['object'].metadata.all()

У меня есть тестовая версия, например, так:

context['object'].metadata.exclude(metadata_type__name__endswith='_Id')

У меня есть соглашение, в котором имя поля метаданных guid оканчивается на _Id, и этот фильтр отлично работает и делает то, что я хочу, чтобы он делал прямо сейчас. Мне не нравится это все же. В будущем я хочу добавить булево поле human_readable в таблицу типов метаданных, и в базе кода есть другие места, где я хочу просмотреть метаданные, удобочитаемые человеком.
В основном я не хочу чтобы использовать этот фильтр в нескольких местах в базе кода, похоже, у меня должен быть метод где-то в модели или менеджере, чтобы я мог скрыть реализацию human_readable (), например, так:

context['object'].metadata.human_readable()

или, может быть,

context['object'].metadata_human_readable()

Я прочитал документацию менеджера документов для django, и я вижу, как на конкретной модели я могу влиять на общий выбор строк. Имеет смысл, что я могу легко сделать менеджера, который будет гарантировать, что он возвращает документы, которые активны и так далее.

То, что я не могу понять, это то, как этот фильтр также включает фильтр родительского документа.

Если у меня есть экземпляр документа, все данные типа документа доступны как document.metadata, что, как мне кажется, связано с тем, что для метода ForeignKey для документа в поле 'related_name' задано значение metdata.

I wi sh, чтобы теперь создать собственный метод, который будет дополнительно ограничивать возврат строк метаданных не только в этот родительский документ, но и на основе некоторых атрибутов связанного типа или даже поля значения метаданных.

Если вы знаете, как, пожалуйста, сообщите мне и поблагодарить вас за любые совет, который вы можете предложить.

-R

...