django视图中来自不同模型的复杂查询

django视图中来自不同模型的复杂查询,django,Django,我有三个模型,它们有一些共同的但不精确的字段,从一个视图中,例如home,我正在这样检索 interviews = Interviews.objects.all().order_by('pub_date')[:3] publications = Publications.objects.all().order_by('pub_date')[:3] published = Published.objects.all().order_by('pub_date')[:3] 从主视图中,我希望它们以这

我有三个模型,它们有一些共同的但不精确的字段,从一个视图中,例如home,我正在这样检索

interviews = Interviews.objects.all().order_by('pub_date')[:3]
publications = Publications.objects.all().order_by('pub_date')[:3]
published = Published.objects.all().order_by('pub_date')[:3]
从主视图中,我希望它们以这样的顺序显示在模板中,所有与这些模型关联的最新/新条目都将位于顶部

比如,如果访谈条目10是所有模型中最新的条目,那么它将是第一条,如果发布的条目是第二条,那么它将是第二条。。。等等等等


有谁能告诉我怎么做吗?

根据您的其他需求,将它们制作成一个公共超类的子类可能是一个好主意—包含公共元素

很难说它是否有效,但如果有效,可以通过调用

SuperClass.objects.all().order_by('-pub_date')[:9]
这将使前9个对象不受子类的约束。当然,假设超类被命名为超类。当然,这并不能保证每个模型有3个

另一种简单的解决方法是对列表进行排序,尽管不使用查询

entries = sorted(list(interviews) + list(publications) + list(published), key=lambda x: x.pub_date, reverse=True)

应该有效-基本上把它们变成列表并排序

一种可能的方法是使用lambda对数据进行排序,但成本很高,因为您将对python而不是DBMS进行排序

lst = []
lst.extend(list(Interviews.objects.order_by('pub_date')[:10]))
lst.extend(list(Publications.objects.order_by('pub_date')[:10]))
lst.extend(list(Published.objects.order_by('pub_date')[:10]))
# take 10 records for each, since you could not know how many records will be picked from which table
# now order them...
lst.sort(lambda x, y: cmp(x.pub_date, y.pub_date))
# and reverse the order, so newset is the first...
lst.reverse()
这将为您提供一个按发布日期排序的对象列表,因此您可以对最终列表进行切片,以获得所需的任意数量的记录

lst = lst[:10]

是否有任何方法可以获取子类的名称,如访谈,以便打印为类别名称:要从超类对象获取子类,您可以使用entry.interview、entry.publication或entry.published来获取每个相应的子类对象。。如果是面试,其他两个都没有设置。有点像使用了这个解决方案,但没有使用超级类