我有以下型号:
class Website(models.Model):
name = models.CharField(max_length=256, unique=True)
class Product(models.Model):
website = models.ForeignKey('Website')
name = models.CharField(max_length=512)
我想运行查询以获取按网站名称分组的产品列表列表。
一个例子:
网站1:名称:'ebay' 网站2:名称:'amazon'
产品1:名称:'pc'网站:'ebay' 产品2:名称:'笔记本'网站:'亚马逊' 产品3:名称:'智能手机'网站:'亚马逊'
我希望得到类似的东西:[[Product1],[Product2,Product3]]
我一直在寻找django文档,但我找不到合适的方法。
答案 0 :(得分:1)
你可以分两步完成......
首先按顺序获取一个查询集,但基本上是一个“平面”列表:
qs = Product.objects.order_by('website__name')
然后您可以使用类似itertools.groupby
的内容输出子列表:
from itertools import groupby
from operator import attrgetter
keyfunc = attrgetter('website')
qs = Product.objects.order_by('website__name')
groups = []
uniquekeys = []
for website_name, products in groupby(qs, keyfunc):
groups.append(list(products))
uniquekeys.append(website_name)
或者,您可以将查询集传递到模板中并使用regroup
templatetag
{{% regroup qs by website as product_list %}
<ul>
{% for group in product_list %}
<li>{{ group.grouper.name }}
<ul>
{% for product in group.list %}
<li>{{ product.name }}: {{ product.website }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>