Как я могу использовать вложенный сериализатор в Django Rest Framework
Здравствуйте, я создаю сериализатор, в котором хочу показать данные профиля пользователя и все его продукты из модели продукта, но это не работает
serializer.py
class UserSerializer(serializers.ModelSerializer):
related_products = ProductSerializer(
source="user.product_set.all", read_only=True, many=True
)
class Meta:
model = User
fields = [
"first_name",
"last_name",
"bio",
"phone",
"agency",
"related_products",
]
views.py
class ProfileView(generics.RetrieveAPIView):
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated, onlyuser]
def retrieve(self, request, *args, **kwargs):
serializer = self.serializer_class(request.user)
return Response(serializer.data, status=status.HTTP_200_OK)
Я нашел решение, если оно подходит, вы можете использовать его в своем проекте
class ProfileView(generics.RetrieveAPIView):
def get(self, request, *args, **kwargs):
qs = Product.objects.filter(user=request.user)
data = {
"user_profile": UserSerializer(request.user).data,
"user_products": ProductSerializer(
qs, many=True, context={"request": request}
).data,
}
return Response(data=data)
** Это пример 4-х шаговых вложенных сериализаторов. с максимальной функциональностью пример с хорошей практикой. Вы можете попробовать следующее. **
** serializers.py**
from rest_framework import serializers
from django.core.validators import MaxValueValidator, MinValueValidator
from diseases.models import (Pest, PesteDoseConfiguration, Disease, DiseaseDoseConfiguration)
from crops.models import (CropStage, CropVariety, Crop)
from project.settings import MEDIA_URL
class PestCropResponseSerializer(serializers.ModelSerializer):
class Meta:
model = Crop
fields = ['id', 'name']
class PestCropVarietyResponseSerializer(serializers.ModelSerializer):
crop = PestCropResponseSerializer()
class Meta:
model = CropVariety
fields = ['id', 'name', 'local_name', 'crop']
class PestCropStageResponseSerializer(serializers.ModelSerializer):
variety = PestCropVarietyResponseSerializer()
class Meta:
model = CropStage
fields = ['id', 'name', 'variety']
class PesteResponseSerializer(serializers.ModelSerializer):
infestation_stages = PestCropStageResponseSerializer()
doses = serializers.SerializerMethodField('get_pest_doses')
image = serializers.SerializerMethodField('get_image_url')
class Meta:
model = Pest
fields = ['id', 'name', 'favourable_weather_condition', 'image', 'infestation_stages', 'doses']
def get_pest_doses(self, Pest):
return PesteDoseConfiguration.objects.filter(paste=Pest.id).order_by('id').values('id', 'generic_name', 'remedial_action', 'preventive_action')
def get_image_url(self, Pest):
return MEDIA_URL+str(Pest.image)
** views.py **
class PesteListView(generics.ListAPIView):
"""
Purpose: list of Pest details
Method: GET
Args:
stage_id: Positive Integer
Returns:
JSON response containing message, status and data if applicable:
Success:
status: Positive Integer
next: URL
previous: URL
limit: Positive Integer
results: List of JSON
Failure:
message: JSON
status: Positive Integer
"""
permission_classes = (IsAuthenticated,)
queryset = Pest.objects.all()
serializer_class = PesteResponseSerializer
def get_queryset(self):
user = self.request.user
req_serializer = PesteCustomRequestSerializer(data=self.request.GET.dict())
if req_serializer.is_valid():
return Pest.objects.filter(infestation_stages=self.request.GET['stage_id']).order_by('id')
raise CustomAPIException(req_serializer.errors)
** exceptions.py **
from rest_framework.exceptions import APIException
from rest_framework import status
class CustomAPIException(APIException):
status_code = status.HTTP_400_BAD_REQUEST