Я довольно новичок в 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