django - 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"
}
}
解决方案
可以使用 DRF 文档中所示的 depth 选项指定嵌套表示:
https://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization
推荐阅读
- javafx - 如何将嵌套的任务进度属性绑定到 JavaFX 中的 TableView?
- python - 将列表附加到另一个列表中。'str' 对象没有属性 'append' 发生错误
- javascript - 如何从 html 输入文件中获取完整路径?像这样 C:/User/Desktop/something.png
- javascript - 离子卡函数调用(onclick)
- python - 定义变量时语法无效
- python - 仅在一个列上将文本文件中的内容写入 csv 文件-如何?
- c++ - 根据轮廓区域大小对轮廓进行排序的问题
- php - 在不使用提交按钮的情况下检测 PHP 表单的任何更改
- windows - 如何根据用户输入作为字符串执行批处理命令
- angular - iOS 上的启动画面块 Ionic