DRF嵌套序列化程序自定义输出



找不到这样的问题,所以这是我的问题:

模型.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()

序列化程序.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"one_answers"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

它返回

[
{
"id": 1,
"files": {
"Texts": [],
"Images": [
{
"id": 1,
"name": "testimage",
"root": 1
}
]
},
"name": ""
}
]

最新更新