Python Django自定义字典响应
我正在使用Django rest框架,我有一个以字典格式返回信息的视图。 这是我的模型:Python Django自定义字典响应,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我正在使用Django rest框架,我有一个以字典格式返回信息的视图。 这是我的模型: class Child(models.Model): name = models.CharField(max_length=50, unique=True) age = models.IntegerField(null=False, blank=False) height = models.IntegerField(null=False, blank=False) 我想将以下响应作
class Child(models.Model):
name = models.CharField(max_length=50, unique=True)
age = models.IntegerField(null=False, blank=False)
height = models.IntegerField(null=False, blank=False)
我想将以下响应作为dictionary返回,其中name
字段是键:
{
"Alice Allen": {
"age": 3,
"height": 98
},
"Bob Brady": {
"age": 4,
"height": 105
}
}
我知道我可以使用GenericAPIView并在“get”方法中实现逻辑(获取数据并解析到字典中),但我想知道是否还有其他使用Django序列化器的解决方案
谢谢。如果您使用的是viewset,您可以尝试覆盖
列表
方法并自定义响应:
class ChildViewSet(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs):
response = super(ChildViewSet, self).list(request, *args, **kwargs)
response.data = {result.pop('name'): result for result in response.data}
return response
我建议您为您的模型实现一个序列化程序,并重写
to_representation
方法,并返回您希望模型的表示方式
范例
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
def to_representation(self, instance):
# Here instance is instance of your model
# so you can build your dict however you like
result = OrderedDict()
result[instance.name] = {"age" : instance.age, "height" : instance.height}
return result
这是个问题,因为它不再是一本字典了。有了这个建议,我会得到:[{“爱丽丝”:“年龄”:3,“身高”:98},] 啊,对于这一点,我建议创建这样一个视图:
class DictView(generics.GenericAPIView):
queryset = Domain.objects.all()
def _get_serialized_items(self, input):
result = OrderedDict()
for item in input:
result[item.name] = {"age" : item.age, "height" : item.height}
return result
def get(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
return self.get_paginated_response(self._get_serialized_items(page))
return Response(self._get_serialized_items(queryset))
这是个问题,因为它不再是一本字典了。有了这个建议,我会得到:[{“Alice”:“age”:3,“height”:98},[@nirnah更新了我的答案,建议返回dict而不是列表,就像你喜欢的那样。虽然它不是一个真正的ModelViewSet,但它仍然有效。也感谢我。问题:我应该使用
ModelViewSet
?