Вложенная модель сериализатора "один ко многим" 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()
здесь для решения проблемы