Django:根据父模型查询多个模型

时间:2019-06-05 01:32:50

标签: python django

我正在Django中创建一个博客,其中有一个基础模型PostType,然后将其扩展为网站上不同类型内容的几个子类。例如CodeSnippetBlogPost

这个想法是,这些内容类型基本上是相同的,它们都有一个作者,一个标题,一个子弹等,但是它们也有一些唯一的字段。例如,博客文章中有一个用于文本内容的字段,而代码段中有一个与编程语言相关的字段。

类似这样的东西:

class PostType(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    title = models.CharField(
        max_length=255,
        unique=True,
    )

    class Meta:
        abstract = True


class BlogPost(PostType):
    content = models.TextField(
        default='',
    )


class GitHubRepo(PostType):
    url = models.URLField(
        unique=True
    )


class CodeSnippet(PostType):
    language = models.ForeignKey(
        to=Language,
        on_delete=models.CASCADE,
    )

现在我想知道的是,是否有任何好的/首选的方法可以查询基于父类PostType的数据库中的所有对象?

对于网站的搜索,我目前正在查询每种不同的内容类型,然后合并结果。这是搜索视图的代码:

class Search(View):
    def get(self, request):
        context = {}
        try:
            query = request.GET.get('s')
            blog_list = models.BlogPost.objects.filter(title__icontains=query)
            projects_list = models.Project.objects.filter(title__icontains=query)
            code_list = models.CodeSnippet.objects.filter(title__icontains=query)
            from itertools import chain
            context['result_list'] = list(chain(blog_list, projects_list, code_list))

        except KeyError:
            query = ''

        context['title'] = 'Result for "{}"'.format(query)

        return render(request, 'blog/search.html', context)

这一切都很好,但是我想知道是否可以同时查询PostType的所有子项?

Django是否以某种方式知道存在哪些子模型?我可以以某种方式使用它吗?

PostType.child_objects.get()或类似的东西。 甚至可以通过编程方式获取所有孩子的方式,以便我可以遍历他们并获取所有对象。

目前我只有几个模型,但是子模型的数量在增加,如果我可以确保所有模型都将基于与它们之间的关系而自动包含在站点搜索中,那将是很好的他们的父模型。

2 个答案:

答案 0 :(得分:1)

如果PostType不是抽象模型,那么您应该可以直接查询它以获得所有这些子类结果

PostType.objects.filter(title__icontains=query)

否则,您无法真正通过单个查询来做到这一点。

  

一种以编程方式让所有孩子都可以做的方法   遍历它们并获得所有对象也可以。

这是可能的---您可以通过编程方式获取子类

PostType.__subclasses__()

答案 1 :(得分:1)

int a = 0x934;//any hex value,the 0x indicates that integer is in base 16 int b = 0x30A; int c = a+b; cout<<c<<endl;//will print the answer in decimal printf("%u\n",c);//prints the answer in hex 是抽象的PostType(因此,它不会创建物理表。它只是在Django中使用future继承)。据我了解,您想生成Model中的list,将其合并到单个QuerySet中,然后在list上进行迭代。

list/QuerySet

希望,对您有帮助。