Как я могу обернуть данные ответа json для djago-rest-framework?
Я использую djano rest framework. У меня есть модель, сериализатор и представление:
class PictureModel(models.Model):
id = models.AutoField(primary_key=True)
url = models.CharField(max_length=256)
class PictureView(mixins.ListModelMixin, generics.GenericAPIView):
serializer_class = PictureSerializer
queryset = PictureModel.objects.all()
def get(self, request):
return self.list(request)
class PictureSerializer(serializers.ModelSerializer):
class Meta:
model = PictureModel
fields = '__all__'
get request return json :
[
{
"id": 120525, "url": "https://ddd.com/upload/iblock/579/5797cc881f8790926cee4a8fc790d1bd.JPG"
},
{
"id": 120526, "url": "https://ddd.com/upload/iblock/382/382526e1deee07f60871430bd806aa71.JPG"
}
...
]
Но мне нужно обернуть эти данные в
{
"success": 1,
"data": [
{
"id": 120525, "url": "https://ddd.com/upload/iblock/579/5797cc881f8790926cee4a8fc790d1bd.JPG"
},
{
"id": 120526, "url": "https://ddd.com/upload/iblock/382/382526e1deee07f60871430bd806aa71.JPG"
}
...
]
Как я могу это сделать? Я могу использовать промежуточное ПО для этого, но я не знаю, как я могу редактировать данные ответа. Middleware применяется для всех запросов, но мне нужно применять его не для всех. Возможно, я могу использовать свой рендерер, но я не знаю как.
P.S. Также я использую автогенератор документации swagger.
Я люблю думать просто. Как насчет:
def json_wrapper(status=True, data):
wrapped = {}
wrapped['status'] = 1 if status else 0
wrapped['data'] = data
return wrapped
Можно быть более гибким, используя классы, но вы поняли идею.
Прежде всего, вам не нужно id
как поле в Django, оно создается автоматически для вас.
Теперь давайте решим вашу проблему следующим образом:
class PictureView(mixins.ListModelMixin, generics.GenericAPIView):
serializer_class = PictureSerializer
queryset = PictureModel.objects.all()
def list(self, request):
response = super().list(request)
return Response({"success": 1 if response.data else 0, "data": response.data})