Python 在Django中依次显示模型对象的两个查询集?

Python 在Django中依次显示模型对象的两个查询集?,python,django,Python,Django,我有两个模型对象的查询集,我想在html页面中一个接一个地显示它们 第一个查询集包含本地餐馆列表,另一个查询集包含连锁餐馆列表。因此,我的列表定义如下: local_restaurants = LocalRestaurants.objects.all() chain_restaurants = ChainRestaurants.objects.all() 有没有一种最佳做法,可以将这些餐厅一家接一家地列出来,直到布景用完 例如,html将显示如下餐厅: localRestaurant1 cha

我有两个模型对象的查询集,我想在html页面中一个接一个地显示它们

第一个查询集包含本地餐馆列表,另一个查询集包含连锁餐馆列表。因此,我的列表定义如下:

local_restaurants = LocalRestaurants.objects.all()
chain_restaurants = ChainRestaurants.objects.all()
有没有一种最佳做法,可以将这些餐厅一家接一家地列出来,直到布景用完

例如,html将显示如下餐厅:

localRestaurant1
chain_restaurant1
localRestaurant2
chain_restaurant2
localRestaurant3
chain_restaurant3
...
编辑 如果其中一个集合耗尽,则另一个集合仍应继续,直到它也耗尽。因此,如果一个列表有3个对象,而另一个列表有7个对象,则应如下所示:

localRestaurant1
chain_restaurant1
localRestaurant2
chain_restaurant2
localRestaurant3
chain_restaurant3
localRestaurant4
localRestaurant5
localRestaurant6
localRestaurant7
您可以使用itertools组合查询集,如下所示:

from itertools import chain
result_list = list(chain(local_restaurants , chain_restaurants))
如果这两个查询集共享一个公共字段,那么您还可以为attrgetter对结果列表Python2.4及更高版本进行排序,否则使用lambda函数

然后在模板中,您只需迭代列表:

{% for item in result_list %}
     {{ item.name}}
{% endfor %}

应该会给出您想要的结果。

此函数将按您想要的方式组合列表:

def combine(list1, list2):
    if len(list1) < len(list2):
        list3 = list2[len(list1):]
    else:
        list3 = list1[len(list2):]
    return list(sum(list(zip(list1, list2)), ())) + list3
模板:

{% for restaurant in restaurants %}
     {{ restaurant.name}}
{% endfor %}

重复:这不是重复,在这种情况下,列表可能大小不同。如果没有字段对结果进行排序,链接结果的目的是什么?@OozeMeister的答案是一个很好的方法。我会尝试一下,然后再报告。我尝试了@OozeMeister给出的解决方案,但它没有达到我想要的效果。只要其中一个列表耗尽,zip解决方案就会停止。我希望仍然包含对象的列表继续运行,直到对象用完。我终于有机会尝试了。这不管用。或者我在这个列表中迭代错误。嗯,zip解决方案是可以的,因为我可以同时操作每个列表中的对象-问题是它先发制人地停止了。我认为在代码中,字段必须具有相同的名称。
restaurants = combine(local_restaurants, chain_restaurants)
{% for restaurant in restaurants %}
     {{ restaurant.name}}
{% endfor %}