首页 > 解决方案 > Django REST Serializer 多对多字段仅通过表ID显示,需要多条记录的列表

问题描述

如何获取 Many 2 Many field 对象的列表?我刚拿到身份证。

这是具有 Many2Many 字段的 MainHost 类

class MainHost(models.Model):
    host_id =  models.IntegerField(verbose_name='HOST ID', primary_key=True)
    group = models.ManyToManyField(MainGroup, related_name='hostgroups', through ='HostGroup')

该类是为 through 关键字创建的,包含 Host 和 Group 的所有关系

class HostGroup(models.Model):
    host = models.ForeignKey(MainHost, on_delete=models.CASCADE)
    group = models.ForeignKey(MainGroup, on_delete=models.CASCADE)

此类包含所有组数据

class MainGroup(models.Model):
    group_id =  models.IntegerField(verbose_name='GROUP ID', primary_key=True)

序列化器类

class MainGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = MainGroup
        fields = (
            'group_id', 
            'group_name',
             ....
            'groupinv_path'
        ) 

HostSerialzer 类

class MainHostSerializer(serializers.ModelSerializer):
    group = serializers.PrimaryKeyRelatedField(queryset=HostGroup.objects.all(), many=True)
    class Meta:
        model = MainHost
        fields = (
            'host_id', 
            'host_name',
            'group'
        )

class HostGroupSerializer(serializers.ModelSerializer):
    host = MainHostSerializer()
    group = MainGroupSerializer()
    class Meta:
        model = HostGroup
        fields = (
            'id',
            'host', 
            'group'  
        )  
        read_only_fields = ['host', 'group']
        def create(self, validated_data):
            host_data = MainHost.objects.create(**validated_data.get('host'))
            group_data = MainGroup.objects.create(**validated_data.get('group'))

            conn = HostGroup.objects.create(
                host=host_data, 
                group=group_data
            )
            return conn  

MainHost API 响应

    {
        "host_id": 4087,
        "host_name": "10.240.144.2",
        "group": [
            280,
            285,
            300
        ]
    }

280、285 和 300 是 MainGroup 中的组对象 我想查看整个对象内容。

MainGroup 响应显示完整的对象。

    {
        "group_id": 2,
        "group_name": "test_environment_production",
        "total_hosts": 1,
        "total_groups": 0,
        "description": "imported",
        "group_variables": "{}",
        "groupinv_path": ""
    }

甚至 GroupHost API 的响应也具有完整的组对象。

    {
        "id": 1,
        "host": {
            "host_id": 4087,
            "host_name": "10.100.144.2",
            "group": [
                280
            ]
        },
        "group": {
            "group_id": 280,
            "group_name": "aruba",
            "total_hosts": 539,
             .....
            "groupinv_path": "TEC/GT/Swi/test.ini"
        }
    }

标签: djangopython-3.xdjango-rest-frameworkmany-to-many

解决方案


可以使用 DRF 文档中所示的 depth 选项指定嵌套表示:

https://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization


推荐阅读