Django Rest 框架嵌套序列化器

Posted

技术标签:

【中文标题】Django Rest 框架嵌套序列化器【英文标题】:Django Rest Framework Nested Serializers 【发布时间】:2018-12-13 10:26:45 【问题描述】:

我目前在使用 Django REST 框架执行两个分层嵌套时遇到问题。我在这里阅读了具有嵌套关系的 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-size,我会附上尺寸)

序列化器.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']

models.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')

【问题讨论】:

你能添加你现在正在使用的序列化程序类,同时添加预期和当前的输出 嗨@JerinPeterGeorge,感谢您抽出宝贵时间尝试回答我的问题。在编辑中添加了您要求的详细信息。另外,我在想我在构建模型时可能是错误的。不确定尺寸是否应该在 Style 或 StyleColor 下。 【参考方案1】:

序列化器.py

class ColorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Color
        fields = '__all__'

class StyleSerializer(serializers.ModelSerializer):
    color = ColorSerializer() # each style has a set of colors attributed to it

    class Meta:
        model = Style
        fields = '__all__'

class SizeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Size
        fields = '__all__'

class StyleColorSerializer(serializers.ModelSerializer):
    size = SizeSerializer() # each style-color combination has a set of sizes attributed to it

    class Meta:
        model = StyleColor
        fields = '__all__'

因为你的模型太复杂了,恐怕上面的代码不太适合。

更笼统地说,如果你想在获取 A 模型(与 B 模型有关系)的查询集的同时附加 B 模型的查询集,你必须在类中定义 BSerializer() ASerializer() 的。

【讨论】:

嗨,我编辑了您的答案以显示 many=True,read_only=True。但是即使这样,它也只会显示到每种样式下的颜色列表,而仍然不显示每种颜色的“尺寸”。不确定如何将“StyleColorSerializer”链接回“Style”【参考方案2】:

感谢所有试图回答的人。从这个链接的答案中获得灵感,以防有人遇到和我一样的麻烦。 Include intermediary (through model) in responses in Django Rest Framework.

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

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

【讨论】:

以上是关于Django Rest 框架嵌套序列化器的主要内容,如果未能解决你的问题,请参考以下文章

django rest 框架模型序列化器 - 读取嵌套,写入平面

如何获取主键相关字段嵌套序列化器django rest框架的所有值

如何在 django rest 框架中的嵌套序列化器相关对象上使用 prefetch_related?

Django Rest Framework 序列化器作为表单和嵌套关系

嵌套序列化程序 django rest 框架中的上下文

django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化器