Django 什么';从不同的模型生成单一提要的最佳方式是什么?
在我的站点中,我有三个模型,组织在两个应用程序中,所有这些模型都有一个Django 什么';从不同的模型生成单一提要的最佳方式是什么?,django,feed,Django,Feed,在我的站点中,我有三个模型,组织在两个应用程序中,所有这些模型都有一个时间戳字段,它定义了站点提要中的出现顺序。我希望生成一个包含所有这些对象的提要,用它们对应的模板呈现每个对象,并按时间戳属性对所有对象进行排序,而不是为每个模型创建提要,并按时间戳字段对单个查询进行排序 我的第一次尝试是列出所有对象,并将它们组合到一个列表中,然后在Python中对它们进行排序: class SiteFeed(Feed): ... def items(self): objects
时间戳
字段,它定义了站点提要中的出现顺序。我希望生成一个包含所有这些对象的提要,用它们对应的模板呈现每个对象,并按时间戳
属性对所有对象进行排序,而不是为每个模型创建提要,并按时间戳
字段对单个查询进行排序
我的第一次尝试是列出所有对象,并将它们组合到一个列表中,然后在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
方法返回一个迭代器。在这种情况下,对象的排序和聚合可以以惰性方式完成。如果在构造迭代器之前对要组合的三个对象集合进行预排序,那么最终排序只是在每次迭代中从正确的集合中选择下一个对象。你明白我的意思吗
例如:
类站点提要(提要):
...
def项目(自身):
i=model1.objects.order_by('timestamp').iterator()
j=model2.objects.order_by('timestamp')。迭代器()
k=model3.objects.order_by('timestamp').iterator()
try:u=i.next()
除了停止迭代:u=None
try:v=j.next()
除了停止迭代:v=None
try:w=k.next()
除StopIteration外:w=无
...
最小产量([u,v,w],key=lambda x:x.timestamp如果x else datetime.max)
...
#此时,您需要重申迭代器
#对应于您生成的变量
#再次屈服
#因此,上面的代码必须在某种循环中
#直到所有迭代器都用完
我不习惯使用迭代器,您能提供一个示例代码来说明您的答案吗?我不知道如何构建迭代器,但我想我理解了它的基本思想。这是一个简单的迭代器。问题仍然存在,我需要按公共属性timestamp
对不同模型的所有对象进行排序。在那段代码中,只返回model1
对象。是的,我给了你一个例子,因为你说你不习惯迭代器。我再次更新了我的答案,让你更好地理解我的意思。对不起,我没有时间写完整的解决方案。这是一个伪代码,我还没有测试过任何东西。好的,我会试试这个,然后带着注释回来。谢谢
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