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

在我的网站中,我有三个模型,组织在两个应用程序中,所有这些模型都有一个时间戳字段,它定义了网站的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
点赞