How can I only depth one field in Django-Rest-Framework?

Viewed 4082

I have a IPv4ListSerializer, it has a depth = 1:

class IPv4ListSerializer(ModelSerializer):
    """
    ipv4
    """
    ip_status = serializers.CharField(read_only=True)
    class Meta:
        model = IPv4Manage
        fields = "__all__"
        depth = 1

but the result it become every field depth 1:

[
    {
        "id": 281,
        "ip_status": "Vlaned",
        "ip": "43.243.33.1",
        "netmask": "255.255.255.248",
        "prefix": 29,
        "is_gateway": false,
        "is_network_ip": false,
        "is_broadcast_ip": false,
        "desc": null,
        "ctime": "2018-04-26T21:17:33.623092+08:00",
        "uptime": "2018-06-02T12:48:41.882016+08:00",
        "ipv4network": {
            "id": 21,
            "network_ip": "43.243.33.0",
            "prefix": 24,
            "ctime": "2018-04-26T21:17:33.533667+08:00",
            "uptime": "2018-04-26T21:17:33.533814+08:00",
            "area_partition": 7
        },
        "vlaned_ipv4network": {
            "id": 1,
            "network_ip": "43.243.33.0",
            "prefix": 29,
            "gateway_ip": "43.243.33.6",
            "broadcast_ip": "43.243.33.7",
            "ctime": "2018-04-26T21:27:56.011624+08:00",
            "uptime": "2018-04-26T21:27:56.258053+08:00",
            "ipv4network": 21,
            "vlanedipv4networkgroup": 4
        },
        "physical_server": {
            "id": 23,
            "name": "SE01-A1",
            "desc": "desc",
            "cpu": "Intel Xeon E3-1230 v5",
            "ram": "Supermicro  DDR4___16",
            "disk": "Inter SSD___240",
            "price": "1000.00",
            "server_status": "ready",
            "pay_time": null,
            "expire_time": null,
            "ipmi_addr": "172.16.30.1",
            "ipmi_account_and_pwd": null,
            "has_intranet": true,
            "intranet_ip": null,
            "customer_desc": null,
            "whmcs_tblorders_id": null,
            "ctime": "2018-05-08T16:15:50.639962+08:00",
            "uptime": "2018-08-20T18:25:27.289100+08:00",
            "switches": 3,
            "physical_server_model": 5,
            "switchesport": 57,
            "cabinet": 3,
            "task": null,
            "user": null,
            "trade_record": null
        }
    },
    ....
]

Can I only depth one field? such as if depth ipv4network, my requirement is:

[
    {
        "id": 281,
        "ip_status": "Vlaned",
        "ip": "43.243.33.1",
        "netmask": "255.255.255.248",
        "prefix": 29,
        "is_gateway": false,
        "is_network_ip": false,
        "is_broadcast_ip": false,
        "desc": null,
        "ctime": "2018-04-26T21:17:33.623092+08:00",
        "uptime": "2018-06-02T12:48:41.882016+08:00",
        "ipv4network": {
            "id": 21,
            "network_ip": "43.243.33.0",
            "prefix": 24,
            "ctime": "2018-04-26T21:17:33.533667+08:00",
            "uptime": "2018-04-26T21:17:33.533814+08:00",
            "area_partition": 7
        },
        "vlaned_ipv4network": 1,
        "physical_server": 23,
    },
    ....
]
1 Answers

depth is applicable for all FK relation in particular model. So, If you need to remove the depth feature for some particular fields, Use different serializers (kind of nested serializer) for each fk field.

Example

class IPv4ListSerializer(ModelSerializer):
    ip_status = serializers.CharField(read_only=True)
    ipv4network = IPV4NetworkSerializer()

    class Meta:
        model = IPv4Manage
        fields = "__all__"
        depth = 1  # remove this "depth"
Related