Как я могу использовать вложенный сериализатор в 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
Вернуться на верх