Вложенная модель сериализатора "один ко многим" django

I am trying to create a relationship between databases 

результат : =>

[ { "id":1, "title": "mobile", "category_two":[ { "id":3, "title": "brand" }, { "id":4, "title": "память" } ] } ]

и я ожидаю: =>

[ { "id":1, "title": "mobile", "category_two":[ { "id":3, "title": "бренд", "category_three":[ { "id":1, "title": "samsung" }, { "id":2, "title": "apple" } ] }, { "id":4, "title": "память", "category_three":[ { "id":1, "title": "32gb" }, { "id":2, "title": "64gb" } ] } ] } ]

// views
class get_Category(APIView):
        def get(self, request):
            category = CategoryOne.objects.all()
            serializer = CategoryTwoSerializer(category, many=True)
            return Response(serializer.data)  
    
    

//serializers

class CategoryOneSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = CategoryOne
        fields = '__all__'

class CategoryTwoSerializer(serializers.ModelSerializer):
    category_two= CategoryOneSerializer(many=True,read_only=True)
    class Meta:
        model = CategoryTwo
        fields = '__all__'
        depth=5
        

class CategoryThreeSerializer(serializers.ModelSerializer):
    category_three = CategoryTwoSerializer(many=True,read_only=True)
    class Meta:
        model = CategoryThree
        fields = '__all__'
        depth=5
        

// models
class CategoryOne(models.Model):
    title = models.CharField(max_length=225)
    
    def __str__(self):
        return self.title


class CategoryTwo(models.Model):
    title = models.CharField(max_length=255)
    categoryone = models.ForeignKey(CategoryOne,related_name='category_two',on_delete=models.SET_NULL,null=True)


    def __str__(self):
        return self.title
    
class CategoryThree(models.Model):
    title = models.CharField(max_length=255)
    categorytwo = models.ForeignKey(CategoryTwo,related_name='category_three',on_delete=models.SET_NULL,null=True)

    def __str__(self):
        return self.title

Попробовать

class CategoryOneSerializer(serializers.ModelSerializer):
    category_two= CategoryTwoSerializer(many=True,read_only=True)
    class Meta:
        model = CategoryOne
        fields = '__all__'

class CategoryTwoSerializer(serializers.ModelSerializer):
    category_three = CategoryThreeSerializer(many=True,read_only=True)
    class Meta:
        model = CategoryTwo
        fields = '__all__'

class CategoryThreeSerializer(serializers.ModelSerializer):
    class Meta:
        model = CategoryThree
        fields = '__all__'

// views
class get_Category(APIView):
        def get(self, request):
            category = CategoryOne.objects.prefetch_related("category_two", "category_two__category_three")
            serializer = CategoryOneSerializer(category, many=True)
            return Response(serializer.data)  

Если вы хотите, чтобы строки category_two, относящиеся к определенной категории category_one, были сериализованы вместе с ней, вы, по сути, хотите добавить несуществующие данные к CategoryOne.
Это означает, что вам нужно добавить его в сериализатор и указать, как его сериализовать.

Здесь вы можете получить доступ к этим данным, используя related_name, поэтому добавление поля с соответствующим related_name будет достаточно, чтобы django нашел нужные вам данные.
То же самое может сделать сериализатор CategoryThree, связанный с конкретной строкой CategoryTwo.

При этом будет создано много SQL-запросов, поскольку каждый раз, когда сериализатор вызывает my_category_on.category_two.all(), требуется sql-запрос.
. prefetch_related() здесь для решения проблемы

Вернуться на верх