Формат DRF JSON

Я создал API для модели News:

models.py

class News(models.Model):
    title = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

serializers.py

class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = [
            "id",
            "title",
            "created_at",
        ]

views.py

class NewsViewSet(ModelViewSet):
    serializer_class = NewsSerializer
    queryset = News.objects.all()

Текущий результат работы этого API, который приведен ниже:

[
    {
        "id": 1,
        "title": "testing1",
        "created_at": "2022-04-02T16:05:08.353708Z",
    }
]

И мой вопрос, есть ли способы изменить формат ответа, как показано ниже? Я не могу понять как сделать с помощью Django DRF.

{
  "status": 0,
  "message": "Success",
  "data": {
    "updatedAt": "2020-08-31 17:49:15",
    "serverTime": "2022-03-23 15:10:11",
    "news": [
      {
        "id": 1,
        "title": "testing1",
        "created_at": "2022-04-02T16:05:08.353708Z",
      }
    ]
  }
}

вы можете использовать to_representation для настройки вашего ответа в ModelSerializer.

serializers.py

class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = [
            "id",
            "title",
            "created_at",
        ]

    def to_representation(self, obj):
        return {
                  "status": 0,
                  "message": "Success",
                  "data": {
                          "updatedAt": "2020-08-31 17:49:15",
                          "serverTime": "2022-03-23 15:10:11",
                  "news": [
                             {
                                "id": obj.id,
                                "title": obj.title,
                                "created_at": obj.created_at,
                              }
                           ]
                          }
                }

Рассмотрите другой способ:

class ResponseOptsMixin:

    def finalize_response(self, request, response, *args, **kwargs):
        response = super().finalize_response(request, response, *args, **kwargs)
        
        result_data = {
            "status": 0,
            "message": "Success",
            "data": {
                "updatedAt": "2020-08-31 17:49:15",
                "serverTime": "2022-03-23 15:10:11",
            },
        }
        model_name = self.queryset.model._meta.model_name
        result_data["data"][model_name] = response.data
        response.data = result_data

        return response


class NewsViewSet(ResponseOptsMixin, ModelViewSet):
    ...

Используйте этот миксин везде, где вам нужно

Вернуться на верх