Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 什么';从不同的模型生成单一提要的最佳方式是什么?_Django_Feed - Fatal编程技术网

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