Как показать отдельное поле в 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"
},
....
]