Django中的嵌套外键序列化程序不工作

2024-09-27 09:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{pr2}$

我希望FoodCuisineSerializer返回一个嵌套列表,该列表将按照各自的烹饪类型和菜系对所有食物进行分类。在

分类是直截了当的,第一级是菜系,第二级是菜系类型,第三级是菜品。在

问题是FoodCuisineSerializer只返回第一级,即只显示菜系列表。但是我想要上一段中给出的食物的完整嵌套列表。在

编辑1:

https://pastebin.com/dmVbyS0G是我从djangoshell得到的。在

编辑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下一步是什么?在


Tags: self列表modelreturnmodelsdeftypelength
1条回答
网友
1楼 · 发布于 2024-09-27 09:33:12

将queryset序列化为

class FoodCuisineSerializer(serializers.ModelSerializer):
    cuisine_type = CuisineTypesSerializer(many=True, read_only=True, source='cuisinetypes_set')

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


参考
1reverse relationship
2^{} in DRF-Serializer



更新1
由于FoodCuisine.objects.all()是一个^{}list类型的对象),您应该在序列化程序中传递many=True,如下所示

^{pr2}$

相关问题 更多 >

    热门问题