首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对Django Rest框架JSON输出进行排序

对Django Rest框架JSON输出进行排序
EN

Stack Overflow用户
提问于 2015-09-10 06:01:52
回答 2查看 1.3K关注 0票数 0

我一直在Django上开发一个web应用程序,我使用Django Rest框架作为我的API。有一个名为Events的模型类,我在DRF中的EventsSerializer是一个非常常见的序列化程序,不需要任何特殊的配置。它只是转储由EventManager返回的数据。

在事件模型类中有一个"type“字段。我现在返回的json是:

代码语言:javascript
运行
复制
{
    events: [
      {object1},
      {object2},
      .....
    ]
}

,作为DRF api中转储并由django返回的任何内容。

出于某种原因,我需要返回按"type“字段分类的事件对象。例如,我需要获取以下内容:

代码语言:javascript
运行
复制
{
    events: [
        type1: [{object1}, {object2},...],
        type2: [{object3}, {object4}, ...],
        .......
    ]
}

我从字面上搜索了与此相关的任何东西,但找不到合适的解决方案。你对此有什么建议吗?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2015-09-10 14:17:54

您可以使用SerializerMethodField并在其中提供自定义序列化逻辑:

代码语言:javascript
运行
复制
class EventSerializer(serializers.Serializer):
    events = serializers.SerializerMethodField(source="get_events")

    def get_events(self, events):
        event_list = {}
        return [event_list[e.type].add({e}) if event.type in event_list else event_list[event.type] = [] for event in events]
票数 1
EN

Stack Overflow用户

发布于 2020-12-31 02:33:54

我有一个类似于下面的模型:

代码语言:javascript
运行
复制
class Book(models.Model):
    title = models.CharField(max_length=200)

class Author(models.Model):
    name = models.CharField(max_length=200)
    books = models.ManyToManyField(Book)

Author生成的JSON如下所示:

代码语言:javascript
运行
复制
{
  "name": "Sir Arthur C. Clarke",
  "books": [
    {
      "title": "Rendezvous with Rama",
    },
    {
      "title": "Childhood's End",
    }
  ]
}

在JSON中,希望书籍按标题排序。由于图书是通过prefetch_related放入查询集中的,因此将order_by添加到视图的查询集中没有任何效果(生成的SQL没有连接到books表)。我想出的解决方案是覆盖get方法。在我的get方法版本中,我让超类生成Response,并在返回数据之前修改它的数据( Python dict),如下所示。

出于两个原因,我并不太担心性能:

  1. 由于prefetch_related的原因,连接已经在Python中完成,而不是在数据库
  2. 中。在我的例子中,每个BookAuthor数相对较少

代码语言:javascript
运行
复制
class AuthorView(RetrieveUpdateAPIView):

    queryset = Author.objects.prefetch_related(
        'books',
    )
    serializer_class = AuthorSerializer

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)

        def key_func(book_json):
            return book_json.get('title', '')

        books = response.data.get('books', [])
        books = sorted(books, key=key_func)
        response.data['books'] = books

        return response
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32489833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档