在我的网站中,我有三个模型,分为两个应用程序,所有这些模型都有一个timestamp
字段,用于定义网站Feed中的外观顺序。我不想为每个模型创建一个Feed并按timestamp
字段排序单个查询,而是生成一个包含所有这些对象的Feed,每个对象都使用相应的模板,并且所有这些对象都按timestamp
属性。
我的第一次尝试是列出所有对象并将它们组合在一个列表中并在Python中对它们进行排序:
class SiteFeed(Feed):
...
def items(self):
objects = list(model1.objects.all()) + list(model2.objects.all()) + list(model3.objects.all())
objects.sort(key=lamda obj: obj.timestamp)
return = objects
答案 0 :(得分:2)
我会从items
方法返回一个迭代器。在这种情况下,对象的排序和聚合可以以惰性方式完成。如果在构造迭代器之前对要组合的三个对象集合进行预排序,则最终排序只是在每次迭代时从右侧集合中选择下一个对象。你明白我的意思吗?
例如:
class SiteFeed(Feed):
...
def items(self):
i = model1.objects.order_by('timestamp').iterator()
j = model2.objects.order_by('timestamp').iterator()
k = model3.objects.order_by('timestamp').iterator()
try: u = i.next()
except StopIteration: u = None
try: v = j.next()
except StopIteration: v = None
try: w = k.next()
except StopIteration: w = None
...
yield min([u,v,w], key=lambda x: x.timestamp if x else datetime.max)
...
# at this point you need to reiterate the iterator
# corresponding to the variable that you yielded
# and yield again
# so, the above code must be in some sort of a loop
# until ALL iterators are exhausted