繁体   English   中英

Django REST Serializer 多对多字段仅通过表 id 显示,需要多条记录列表

[英]Django REST Serializer Many to Many field displays only through table id, need list of many records

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

这是具有 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 Response 显示完整的对象。

    {
        "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"
        }
    }

可以使用深度选项指定嵌套表示,如 DRF 文档中所示:

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

删除这一行: group = serializers.PrimaryKeyRelatedField(queryset=HostGroup.objects.all(), many=True)

来自 MainHostSerializer(serializers.ModelSerializer):

并添加深度 = 2 效果很好

暂无
暂无

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

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