Django REST Serializer Many-to-Many字段仅通过表id显示,需要许多记录的列表



如何获取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关键字创建的,包含主机和组的所有关系

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  

主主机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-嵌套序列化

删除此行:group=序列化程序。PrimaryKeyRelatedField(queryset=HostGroup.objects.all((,many=True(

来自MainHostSerializer(serializers.ModelSerializer(:

加上深度=2,效果良好

最新更新