从不同模型生成单个Feed的最佳方法是什么?

时间:2011-10-02 23:34:22

标签: django feeds

在我的网站中,我有三个模型,分为两个应用程序,所有这些模型都有一个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

1 个答案:

答案 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