В упрощенном примере у меня есть несколько моделей, одна из которых мне не принадлежит, потому что это базовая модель, используемая пакетом CMS, называемая Page
, и довольно много, которые у меня есть, с упрощенным кодом:
class MyPage(Page):
pass
class MyBlogPage(Page):
tags = models.WhateverField(default=something, etc)
class NewsPage(Page):
tags = models.WhateverField(default=something, etc)
class DocumentationPage(Page):
pass
...
Этот дублированный код, к сожалению, не является выбором: он существует из-за унаследованного кода, который невероятно сложно вытащить и реорганизовать, и вот чем он является.
Теперь я хотел бы найти все связанные страницы, когда я нахожусь на блоге или на странице новостей, поэтому я решил, что сделаю это:
related_pages = Page.objects.filter(tags__isnull=False).filter(tags__in=self.tags).exclude(pk=self.pk)
И это приводит к сбою Django, потому что не все экземпляры Page
имеют столбец базы данных с именем tags
, а isnull
работает, предполагая, что столбец существует, и проверяя, является ли значение для этого поля null
или нет.
Я также не могу просто добавить поле tags
к модели Page
верхнего уровня, потому что у меня нет к нему какого-либо доступа, поэтому я не могу "подобрать" модели таким образом. После долгих поисков в Google и SO я не могу найти ни одной документации или вопросов / ответов, которые бы указывали на то, как проверить наличие столбца 1021 *, прежде чем смотреть на его значение. итак:
есть ли способ отфильтровать объекты, которые даже имеют определенный столбец (в данном случае tags
) сначала, чтобы последующие операции могли использовать это значение в этом столбце?