自定义嵌套序列化程序和查找

时间:2019-08-29 06:14:58

标签: django-rest-framework

我有一个Category模型和一个Menu模型,我想显示JSON数据,如下所示:

{
   "category":{
      "category": "Something",
      "menu": [
                {
                    "id": 1,
                    "dish": "Sample Dish",
                    "price": 150,
                    "restaurant": 1
                },
                {
                    "id": 1,
                    "dish": "Sample Dish",
                    "price": 150,
                    "restaurant": 1
                },
              }

}

以下是模型:

class Menu(models.Model):
    dish = models.CharField(max_length=250)
    category = models.ForeignKey('Menu_Category',on_delete=models.CASCADE,related_name='menu')
    price = models.IntegerField()
    restaurant = models.ForeignKey('Restaurant',on_delete=models.CASCADE,related_name='menu')

    def __str__(self):
        return self.dish

class Menu_Category(models.Model):
    category = models.CharField(max_length=255,default='')

    def __str__(self):
        return self.category

    class Meta:
        verbose_name = 'Menu Category'
        verbose_name_plural = 'Menu Categories'

这是序列化器:

class MenuSerializer(serializers.Serializer):
    class Meta:
        model = Menu
        fields =['dish','price','restaurant']

class MenuCategorySerializer(serializers.Serializer):
    menu = MenuSerializer(read_only=True,many=True)

    class Meta:
        model = Menu_Category
        fields = ['category','menu']

我也尝试构建一些自定义的嵌套序列化程序,似乎无法正确获取JSON数据。

2 个答案:

答案 0 :(得分:0)

您应该能够通过在返回其相关菜单的类别模型上创建属性来执行此操作。仅供参考(您也可以使用self.menu_set.all())。参见下面的型号更改

class Menu_Category(models.Model):
    category = models.CharField(max_length=255,default='')

    def __str__(self):
        return self.category

    class Meta:
        verbose_name = 'Menu Category'
        verbose_name_plural = 'Menu Categories'

    @property
    def menu(self):
        return Menu.objects.filter(category=self)

在序列化器中,将序列化器继承更改为ModelSerializer。除非您在models.py中的属性名称不同于序列化器字段名称

,否则您无需更改任何其他内容

Sources in Rest framework serializers

class MenuCategorySerializer(serializers.ModelSerializer):
    menu = MenuSerializer(read_only=True,many=True, source='menu') # -- Source must be the same as declared in models.py property

    class Meta:
        model = Menu_Category
        fields = ['category','menu']

答案 1 :(得分:0)

您必须在id字段中添加MenuSerializer,并且可以在序列化程序中将反向关系menu_setsource参数一起使用,如下所示

class MenuSerializer(serializers.Serializer):
    class Meta:
        model = Menu
        fields =['id', 'dish','price','restaurant']

class MenuCategorySerializer(serializers.Serializer):
    menu = MenuSerializer(read_only=True,many=True, source='menu_set')

    class Meta:
        model = Menu_Category
        fields = ['category','menu']