根据子类是否具有特定字段来过滤Django超类QuerySets

时间:2019-06-05 22:21:00

标签: django django-queryset

在一个简化的示例中,我有几个模型,我不拥有一个模型,因为它是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的工作原理是假设该列存在,并测试 value < / em>该字段是否为null

我也不能只将tags字段添加到顶级Page模型中,因为我无法对其进行任何访问,因此我无法“填充”以这种方式建模。在经过大量搜索Google和SO之后,我一生都找不到能暗示如何测试列的 existence 的文档或Q / A。值,因此:

有一种方法可以过滤那些甚至拥有特定列(在这种情况下为tags)的对象,以便后续操作可以使用该列中的值?

0 个答案:

没有答案