我有三个模型,其中有一些常见但不精确的字段,从单个视图ex。我正在检索这样的
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是这些所有模型中的最新条目,那么它将是第一个,然后如果发布的第二个是最近的第二个......等等.etc任何人都可以告诉我该怎么做吗?
答案 0 :(得分:0)
根据您的其他要求,将它们变成共同超类的子库可能是个好主意 - 包含共同的元素。
很难说它是否有效,但如果你这样做,你可以通过调用
分别或一起查询不同类型的对象SuperClass.objects.all().order_by('-pub_date')[:9]
将使9个第一个对象不再是它们所处的sublcass。当然假设超类被命名为SuperClass。当然,这并不能确保每个模型中有3个。
解决它的另一种简单方法 - 虽然不可否认使用查询只是对列表进行排序。
entries = sorted(list(interviews) + list(publications) + list(published), key=lambda x: x.pub_date, reverse=True)
应该工作 - 基本上把它们变成列表并对它们进行排序。
答案 1 :(得分:0)
一种可能的方法是使用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()
这将为您提供列表对象排序py pub_date ,因此您可以切片最终列表以获得您想要的任意数量的记录...
lst = lst[:10]