DRF 嵌套序列化程序自定义输出
DRF nested serializers custom output
找不到这样的问题,所以这是我的问题:
models.py(简体)
class Root(models.Model):
name = models.CharField()
class TextFile(models.Model):
root = models.ForeignKey(Root)
name = models.CharField()
class ImageFile(models.Model):
root = models.ForeignKey(Root)
name = models.CharField()
serializers.py
class TextFileSerializer(serializers.Modelserializer):
class Meta:
model = TextFile
fields = '__all__'
class ImageFileSerializer(serializers.Modelserializer):
class Meta:
model = ImageFile
fields = '__all__'
class FilesSerializer(serializers.Modelserializer):
Texts = TextFileSerializer(source='textfile_set', many=True, read_only=True)
Images = ImageFileSerializer(source='imagefile_set', many=True, read_only=True)
class Meta:
model = Root
fields = '__all__'
class RootSerializer(serializers.Modelserializer):
files = FilesSerializer(many=True, read_only=True)
class Meta:
model = Root
fields = '__all__'
我在输出中只有根 'id' 和 'name' 但没有 'files'.
我期望这样的输出:
{
'id': 0,
'name': 'Root instance 1',
'files': {
'Texts': [
{'id': 0, 'name': 'Text1'},
{'id': 1, 'name': 'Text2'},
...
],
'Images': [
{'id': 0, 'name': 'Image1'},
{'id': 1, 'name': 'Image2'},
...
]
}
}
有人可以帮我吗?
您在 RootSerializer
中的 FilesSerializer
字段总是返回 None,因为 Root 没有 属性 命名为 'files'。默认情况下,DRF 序列化程序不会在响应中添加 None 字段。您的 FileSerializer 请求 RootModel。
你想要的是一种从你的根模型中检索文件的方法,所以你可以做的是使用 SerializerMethodField,在这个方法中,获取你需要的数据,并使用你的 FileSerializer 序列化它们(但作为普通序列化器)。
像这样:
class TextFileSerializer(serializers.ModelSerializer):
class Meta:
model = TextFile
fields = '__all__'
class ImageFileSerializer(serializers.ModelSerializer):
class Meta:
model = ImageFile
fields = '__all__'
class FilesSerializer(serializers.Serializer):
Texts = TextFileSerializer(source='textfile_set', many=True)
Images = ImageFileSerializer(source='imagefile_set', many=True)
class Meta:
fields = '__all__'
class RootSerializer(serializers.ModelSerializer):
files = serializers.SerializerMethodField()
class Meta:
model = Root
fields = '__all__'
def get_files(self, instance):
return FilesSerializer(instance).data
它returns
[
{
"id": 1,
"files": {
"Texts": [],
"Images": [
{
"id": 1,
"name": "testimage",
"root": 1
}
]
},
"name": ""
}
]
找不到这样的问题,所以这是我的问题:
models.py(简体)
class Root(models.Model):
name = models.CharField()
class TextFile(models.Model):
root = models.ForeignKey(Root)
name = models.CharField()
class ImageFile(models.Model):
root = models.ForeignKey(Root)
name = models.CharField()
serializers.py
class TextFileSerializer(serializers.Modelserializer):
class Meta:
model = TextFile
fields = '__all__'
class ImageFileSerializer(serializers.Modelserializer):
class Meta:
model = ImageFile
fields = '__all__'
class FilesSerializer(serializers.Modelserializer):
Texts = TextFileSerializer(source='textfile_set', many=True, read_only=True)
Images = ImageFileSerializer(source='imagefile_set', many=True, read_only=True)
class Meta:
model = Root
fields = '__all__'
class RootSerializer(serializers.Modelserializer):
files = FilesSerializer(many=True, read_only=True)
class Meta:
model = Root
fields = '__all__'
我在输出中只有根 'id' 和 'name' 但没有 'files'.
我期望这样的输出:
{
'id': 0,
'name': 'Root instance 1',
'files': {
'Texts': [
{'id': 0, 'name': 'Text1'},
{'id': 1, 'name': 'Text2'},
...
],
'Images': [
{'id': 0, 'name': 'Image1'},
{'id': 1, 'name': 'Image2'},
...
]
}
}
有人可以帮我吗?
您在 RootSerializer
中的 FilesSerializer
字段总是返回 None,因为 Root 没有 属性 命名为 'files'。默认情况下,DRF 序列化程序不会在响应中添加 None 字段。您的 FileSerializer 请求 RootModel。
你想要的是一种从你的根模型中检索文件的方法,所以你可以做的是使用 SerializerMethodField,在这个方法中,获取你需要的数据,并使用你的 FileSerializer 序列化它们(但作为普通序列化器)。
像这样:
class TextFileSerializer(serializers.ModelSerializer):
class Meta:
model = TextFile
fields = '__all__'
class ImageFileSerializer(serializers.ModelSerializer):
class Meta:
model = ImageFile
fields = '__all__'
class FilesSerializer(serializers.Serializer):
Texts = TextFileSerializer(source='textfile_set', many=True)
Images = ImageFileSerializer(source='imagefile_set', many=True)
class Meta:
fields = '__all__'
class RootSerializer(serializers.ModelSerializer):
files = serializers.SerializerMethodField()
class Meta:
model = Root
fields = '__all__'
def get_files(self, instance):
return FilesSerializer(instance).data
它returns
[
{
"id": 1,
"files": {
"Texts": [],
"Images": [
{
"id": 1,
"name": "testimage",
"root": 1
}
]
},
"name": ""
}
]