Формат 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):
...
Используйте этот миксин везде, где вам нужно