Как я могу обернуть данные ответа 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})
Вернуться на верх