我一直在Django上开发一个web应用程序,我使用Django Rest框架作为我的API。有一个名为Events的模型类,我在DRF中的EventsSerializer是一个非常常见的序列化程序,不需要任何特殊的配置。它只是转储由EventManager返回的数据。
在事件模型类中有一个"type“字段。我现在返回的json是:
{
events: [
{object1},
{object2},
.....
]
}
,作为DRF api中转储并由django返回的任何内容。
出于某种原因,我需要返回按"type“字段分类的事件对象。例如,我需要获取以下内容:
{
events: [
type1: [{object1}, {object2},...],
type2: [{object3}, {object4}, ...],
.......
]
}
我从字面上搜索了与此相关的任何东西,但找不到合适的解决方案。你对此有什么建议吗?
提前感谢
发布于 2015-09-10 14:17:54
您可以使用SerializerMethodField并在其中提供自定义序列化逻辑:
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]
发布于 2020-12-31 02:33:54
我有一个类似于下面的模型:
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如下所示:
{
"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
),如下所示。
出于两个原因,我并不太担心性能:
prefetch_related
的原因,连接已经在Python中完成,而不是在数据库Book
的Author
数相对较少。
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
https://stackoverflow.com/questions/32489833
复制相似问题