首页 > 解决方案 > Django Rest 框架嵌套序列化器

问题描述

我目前在使用 Django 休息框架执行两个分层嵌套时遇到问题。我已经阅读了具有嵌套关系的 DRF 文档http://www.django-rest-framework.org/api-guide/relations/并成功完成了第一层,即在 JSON 中显示具有多种颜色的样式。不知道如何链接另一层。任何帮助,将不胜感激。提前致谢!

当前输出如下所示:

[{
    "name": "AAA123",
    "colors": [
        {
            "name": "White"
        }
    ]
},
{
    "name": "BBB222",
    "colors": [
        {
            "name": "White"
        },
        {
            "name": "Pink"
        },
        {
            "name": "Blue"
        }
    ]
}]

想要的输出应该是这样的:

[{
    "name": "AAA123",
    "colors": [
        {
            "name": "White",
            "sizes": [{name: "S"}, {name: "M"}]
        }
    ]
},
{
    "name": "BBB222",
    "colors": [
        {
            "name": "White",
            "sizes": [{name: "XS"}, {name: "S"}]
        },
        {
            "name": "Pink"
            "sizes": [{name: "XL"}, {name: "XXL"}]
        },
        {
            "name": "Blue"
            "sizes": [{name: "L"}, {name: "XL"}]
        }
    ]
}]

具体来说,我想展示每种样式都有一组归因于它的颜色,并且每个样式-颜色组合都有一组归因于它的尺寸。

下面是我当前的 serializers.py 和 models.py 我使用了中间表,因为我计划在未来添加更多的复杂性(例如,在 style-color 我想附加彩色图片的位置和 style-color-尺寸,我会附上尺寸)

序列化程序.py

class ColorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Color
        fields = ['name']


class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = ['name']


class StyleSerializer(serializers.ModelSerializer):
    colors = ColorSerializer(many=True, read_only=True)

    class Meta:
        model = Style
        fields = ['name', 'colors']

模型.py

class Style(models.Model):
    name = models.CharField(max_length=36, unique=True)
    colors = models.ManyToManyField('Color', through='StyleColor')



class Color(models.Model):
    name = models.CharField(max_length=36, unique=True)



class Size(models.Model):
    name = models.CharField(max_length=12, unique=True)



class StyleColor(models.Model):
    style = models.ForeignKey('Style', on_delete=models.CASCADE)
    color = models.ForeignKey('Color', on_delete=models.CASCADE)
    sizes = models.ManyToManyField('Size', through='StyleColorSize')

    class Meta:
        unique_together = ('style', 'color')



class StyleColorSize(models.Model):
    style_color = models.ForeignKey('StyleColor', on_delete=models.CASCADE)
    size = models.ForeignKey('Size', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('style_color', 'size')

标签: djangodjango-rest-framework

解决方案


感谢所有试图回答的人。从这个链接的答案中获得灵感,以防有人遇到和我一样的麻烦。在 Django Rest Framework 的响应中包含中介(通过模型)

class StyleSerializer(serializers.ModelSerializer):
    colors = StyleColorSerializer(source='stylecolor_set',
                                  many=True, read_only=True)

    class Meta:
        model = Style
        fields = ('name', 'colors')

推荐阅读