Django Rest Framework 按类别重新组合查询集

pen*_*ent 3 python django serialization grouping django-rest-framework

在我正在处理的当前项目中,我需要按类别重新组合(分组)一个查询集,并将具有相同类别的内容放在一起提供的列表中。我有以下模型结构:

class Category(models.Model):
    title = models.CharField(max_length=255)

class Item(models.Model):
   title = models.CharField(max_length=255)
   category = models.ForeignKey(to="Category", verbose_name=_('category'), related_name='items',
                                 on_delete=models.SET_NULL, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

我希望输出序列化结果如下:

    {
     "category_title_1":[
        {
          "id": 1,
          "title" : "something",
        },
        {
          "id": 2,
          "title": "something else",
        }
      ],
    "category_title_2": [
      {
       "id": 3,
       "title": "another string",
      }, 
      {
       "id": 4,
       "title": "and yet another title",
      }
    ]
  }  
Run Code Online (Sandbox Code Playgroud)

我知道我总是可以遍历查询集并手动对它们进行分组,我想知道是否有一种本地有效的方法来做到这一点。

谢谢

Wil*_*ing 7

我不相信使用 ORM 本身是可能的,尽管正如 Guybrush 提到的,itertools.groupby可以用来实现这一点 - 并且以一种相当优雅的方式。

from itertools import groupby
from operator import itemgetter
from rest_framework.response import Response

items = Item.objects.values('category__title', 'id', 'title').order_by('category__title')
rows = groupby(items, itemgetter('category__title'))
return Response({c_title: list(items) for c_title, items in rows})
Run Code Online (Sandbox Code Playgroud)