Фильтрация суперклассов Django QuerySets на основе подкласса, имеющего определенное поле или нет - PullRequest
0 голосов
/ 06 июня 2019

В упрощенном примере у меня есть несколько моделей, одна из которых мне не принадлежит, потому что это базовая модель, используемая пакетом 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) сначала, чтобы последующие операции могли использовать это значение в этом столбце?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...