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()
是一个 QuerySet
(list
类型对象),您应该在序列化程序中传递 many=True
,如
y = FoodCuisineSerializer(FoodCuisine.objects.all(), <b>many=True</b>)
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()
是一个 QuerySet
(list
类型对象),您应该在序列化程序中传递 many=True
,如
y = FoodCuisineSerializer(FoodCuisine.objects.all(), <b>many=True</b>)