Django 中的嵌套外键序列化程序无法正常工作

Nested foreign key serializer in django not working

models.py的一部分:

class FoodCuisine(models.Model):
    cuisine = models.CharField(max_length=64)

    def __str__(self):
        return self.cuisine


class CuisineTypes(models.Model):
    cuisine_types = models.CharField(max_length=64)
    cuisine = models.ForeignKey(FoodCuisine, on_delete=models.CASCADE)

    def __str__(self):
        return self.cuisine_types

    class Meta:
        ordering = ('cuisine_types',)


class Food(models.Model):
    name = models.CharField(max_length=192)
    veg = models.BooleanField(default=0)
    cuisine_type = models.ForeignKey(CuisineTypes, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    def _cuisine(self):
        return self.cuisine_type.cuisine

serializers.py:

class FoodSerializer(serializers.ModelSerializer):
    class Meta:
        model = Food
        fields = ('name', 'veg')


class CuisineTypesSerializer(serializers.ModelSerializer):
    foods = FoodSerializer(many=True, read_only=True, source='food_set')
    class Meta:
        model = CuisineTypes
        fields = ('cuisine_types', 'foods')


class FoodCuisineSerializer(serializers.ModelSerializer):
    cuisine_type = CuisineTypesSerializer(many=True, read_only=True, source='cuisinetypes_set')
    class Meta:
        model = FoodCuisine
        fields = ('cuisine', 'cuisine_type')

我想要 FoodCuisineSerializer 到 return 一个嵌套列表,其中将所有食品按各自的菜系类型和菜系分类。

分类很简单,第一级有菜系列表,第二级有菜系列表,第三级有食品。

问题是 FoodCuisineSerializer 仅 return 第一级 仅显示菜系列表。但我想要上一段中给出的完整嵌套食品列表。

编辑 1:

https://pastebin.com/dmVbyS0G 是我从 Django 得到的 shell.

编辑 2:

如果我写

>>> y = FoodCuisineSerializer(FoodCuisine.objects.get(id=2))
>>> y.cuisine_type
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'FoodCuisineSerializer' object has no attribute 'cuisine_type'

为什么会出现上述错误?

编辑 3:

在正确的位置得到了 source 但现在我得到:

>>> y = FoodCuisineSerializer(FoodCuisine.objects.get(id=2))
>>> y.data # I get the desired result having OrderedDict
>>> y = FoodCuisineSerializer(FoodCuisine.objects.all())
>>> y.data
[Error]

[错误]:https://pastebin.com/0DW28qv4下一步是什么?

将查询集序列化为

时设置source='cuisinetypes_set'
class FoodCuisineSerializer(serializers.ModelSerializer):
    cuisine_type = CuisineTypesSerializer(many=True, read_only=True, <b>source='cuisinetypes_set'</b>)

    class Meta:
        model = FoodCuisine
        fields = ('cuisine', 'cuisine_type')


参考
1. reverse relationship
2. source in DRF-Serializer


更新 1
由于 FoodCuisine.objects.all() 是一个 QuerySetlist 类型对象),您应该在序列化程序中传递 many=True,如

y = FoodCuisineSerializer(FoodCuisine.objects.all(), <b>many=True</b>)