如何通过对象中的字段对对象进行分组,以使具有该字段值相同的所有对象都在JSON的一个文件夹/图层/括号下?
例如,改变一下:
{
"foo" : [
{
"type" : "letter",
"value" : "x"
},
{
"type" : "letter",
"value" : "y"
},
{
"type" : "letter",
"value" : "z"
},
{
"type" : "number",
"value" : "1"
},
{
"type" : "number",
"value" : "0"
}
]
}
对此:
{
"bar" : {
"letter" : ["x", "y", "z"],
"number" : ["1", "0"]
}
}
对于上下文,这里有一些我的代码归结为相关部分:
class TagSerializer(serializers.ModelSerializer):
type = serializers.CharField(source='type.type')
class Meta:
model = Tag
fields = ('tag', 'type')
class Tag(models.Model):
type = models.ForeignKey('TagType', models.CASCADE, 'tags')
tag = models.CharField(max_length=254, unique=True)
class TagType(models.Model):
type = models.CharField(max_length=254, unique=True)
在伪代码中,我认为这是实现这一目标的第一步。如何在有或没有DRF的情况下实施?我把它放在哪里?
def TagTypeSerializer():
types = TagType.objects.all()
json = []
for t in types:
json += t.type
return json
答案 0 :(得分:1)
尽管可能,但您必须完全覆盖视图的list()
方法:
class ListTags(generics.ListAPIView):
def transform_result(self, data):
"""Your custom data transformations"""
result = {'tags': set(), 'types': set()}
for tag in data:
result['tags'].update(data['tag'])
result['types'].update(data['type'])
return result
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(self.transform_result(serializer.data))
serializer = self.get_serializer(queryset, many=True)
return Response(self.transform_result(serializer.data))
答案 1 :(得分:-2)
Django REST框架序列化器不会那样工作。 您可能希望将自己的类推送到序列化/反序列化。