在我的网站中,我有三个模型,组织在两个应用程序中,所有这些模型都有一个时间戳字段,它定义了网站的Feed中的外观顺序.我不想为每个模型创建一个feed并按时间戳字段排序单个查询,而是生成一个包含所有这些对象的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
最佳答案 我会从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