由FK领域分组

时间:2014-01-14 15:34:07

标签: python django django-models

我有以下型号:

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文档,但我找不到合适的方法。

1 个答案:

答案 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>
相关问题