繁体   English   中英

在序列化器中自定义嵌套数据

[英]Customize the nested data in Serializer

我有一个ModelSerializer:

class WorkOrderRetrieveSerializer(ModelSerializer):

    workordercomments = WorkOrderCommentForWorkOrderSerializer(many=True, read_only=True)
    class Meta:
        model = WorkOrder
        fields = "__all__"

JSON数据如下:

{
    "id": 1,
    "workordercomments": [
    .....

        {
            "id": 21,
            "content": "test files",
            "files": "[71]",
            "ctime": "2018-01-11T11:03:17.874268+08:00",
            "uptime": "2018-01-11T11:03:17.874362+08:00",
            "workorder": 1,
            "comment_user": {
                "id": 5,
                "username": "test03",
                "is_admin": true
            }
        }
    ],
    "workorder_num": "WON15118747168252",
    "name": "order01",
    "content": "first conntetn",
    "workordertype": "teck",
    "workorder_status": "created",
    "user_most_use_email": "lxas@128.com",
    "server_id": null,
    "public_ip": null,
    "belong_area": null,
    "files": null,
    "ctime": "2017-11-28T21:11:56.826971+08:00",
    "uptime": "2017-11-28T21:11:56.827064+08:00",
    "to_group": 3,
    "user": 2
}

在我的JSON中"files": "[71]",是包含文件id的组的字符串。

workordercomments是工作workordercomments的相关名称。

我想在JSON workordercomments显示如下files

        {
            "id": 21,
            "content": "test files",
            "files": "['/media/images/xxxxx.png']",
            "ctime": "2018-01-11T11:03:17.874268+08:00",
            "uptime": "2018-01-11T11:03:17.874362+08:00",
            "workorder": 1,
            "comment_user": {
                "id": 5,
                "username": "test03",
                "is_admin": true
            }
        }

我想要的“文件”值是链接而不是其id

"files": "['/media/images/xxxxx.png']", 

要么

"files": ['/media/images/xxxxx.png'],

是否可以自定义格式? 我应该实现串行器中的什么功能吗?

您需要根据文档实现自定义serialzier,并覆盖由ModelSerializer生成的默认值。

例如:

from rest_framework.fields import Field

class FileRelatedField(RelatedField):
    def to_representation(self, instance):
        return instance.file_path # or whereever that path comes from


class WorkOrderRetrieveSerializer(ModelSerializer):
    class Meta:
        model = WorkOrder
        fields = '__all__'

    files = FileRelatedField(
        many=True, 
        source='file_set.all'
    )

根据您的__str__值在文件模型上的显示方式,您可以执行以下操作:

from rest_framework.serializers import StringRelatedField

class WorkOrderRetrieveSerializer(ModelSerializer):
    class Meta:
        model = WorkOrder
        fields = '__all__'

    files = StringRelatedField(
        many=True, 
        source='file_set.all'
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM