在Django中一个接一个地显示模型对象的两个查询集?

时间:2015-01-13 19:12:07

标签: python django

我有两个模型对象的查询集,我想在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

2 个答案:

答案 0 :(得分:0)

您可以使用itertools来组合查询集,如下所示:

from itertools import chain
result_list = list(chain(local_restaurants , chain_restaurants))

如果两个查询集共享一个公共字段,您还可以对结果列表进行排序(对于attrgetter,Python 2.4及更高版本,否则使用lambda函数)

from operator import attrgetter
result_list = sorted(
    chain(local_restaurants , chain_restaurants),
    key=attrgetter('date_created'))

然后在你的模板中,你只需遍历列表:

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

应该给你你想要的结果。

答案 1 :(得分:0)

此功能将按您的意图组合您的列表:

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

用法:

restaurants = combine(local_restaurants, chain_restaurants)

模板:

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