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": ""
    }
]