![](/img/trans.png)
[英]django select only specific fields from many to many field in serializer
[英]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.