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?