Как показать отдельное поле в drf

У меня есть сериализатор Reviews & Ratings. Я хочу показать общее количество отзывов в ответе. В текущей реализации я получаю количество отзывов, но оно отображается на всех отзывах, как показано ниже:

[
    {
        "review_count": 2,
        "user": "don sebastian",
        "rating": 3.9,
        "review": "Rating for pendant 1 by Don",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-27"
    },
    {
        "review_count": 2,
        "user": "Jackson Patrick Gomez",
        "rating": 4.5,
        "review": "cool review Pendant 1",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-29"
    }
]

То, что я хочу получить, выглядит следующим образом review_count seperatley

[
   "review_count": 2,
    {
        "user": "don sebastian",
        "rating": 3.9,
        "review": "Rating for pendant 1 by Don",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-27"
    },
    {
        "user": "Jackson Patrick Gomez",
        "rating": 4.5,
        "review": "cool review Pendant 1",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-29"
    }
]

#Serializer.py

class ReviewSerializer(ModelSerializer):
    user = SerializerMethodField()
    review_count = SerializerMethodField()

    class Meta:
        model = ReviewRatings
        fields = ["review_count", "user", "rating", "review", "created_at", "updated_at"]

    def get_user(self, obj):
        return f"{obj.user.first_name} {obj.user.last_name}"
    
    def get_review_count(self, obj):

Самым простым способом, как я полагаю, является прямое редактирование ответа конечной точки.

Предполагая, что вы подошли к DRF согласно инструкциям; ( это легкое руководство для вас), вы собираетесь удалить review_count из вашего сериализатора и подойти к вашему методу get следующим образом:

def get(self, request, *args, **kwargs):
      ..........
      serializer = ReviewSerializer(reviews, many=True)
      dict_copy = serializer.data.copy()
      dict_copy[0]=str(Review.objects.all().count()) # or wherever that count comes from
      return Response(dict_copy, status=status.HTTP_200_OK)

Таким образом, вы создаете копию сериализатора и затем добавляете туда свое значение. Поскольку serializer.data возвращает массив с диктой внутри, чтобы получить доступ к этой точке, вы сделаете dict_copy[0]. В противном случае, если вы хотите иметь доступ к ней как к паре key-value, вы можете назначить ее как

      dict_copy[0]={"review_count": str(Review.objects.all().count())}

и ваш результат будет примерно таким:

[
    {
        "review_count": "4"
    },
    {
        "user": "don sebastian",
        "rating": 3.9,
        "review": "Rating for pendant 1 by Don",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-27"
    },

Последнее, вы можете попробовать напрямую отредактировать ваш ответ и добавить туда значение ключевой пары, но я предполагаю, что это не принесет вам никакой пользы, поскольку это находится вне вашего сериализатора:

  x = Review.objects.all().count()
  return Response(( {"review_count":str(x)}, serializer.data), status=status.HTTP_200_OK)
[
    {
        "review_count": "4"
    },
    [
    {
       
        "user": "don sebastian",
        "rating": 3.9,
        "review": "Rating for pendant 1 by Don",
        "created_at": "2022-11-27",
        "updated_at": "2022-11-27"
    },
        ....
]
Вернуться на верх