Django DRF中如何在桥接模型序列化器中展示嵌套数据
解决DRF中Run序列化器返回RunBuild带完整Build数据的问题
先确认模型关联(参考示例)
假设你的模型结构如下(如果和实际代码有差异,调整对应字段名即可):
# models.py from django.db import models class Build(models.Model): name = models.CharField(max_length=100) version = models.CharField(max_length=50) # 其他自定义字段 class Run(models.Model): name = models.CharField(max_length=100) start_time = models.DateTimeField(auto_now_add=True) # 其他自定义字段 class RunBuild(models.Model): run = models.ForeignKey(Run, on_delete=models.CASCADE, related_name='run_builds') build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='run_builds') status = models.CharField(max_length=20, default='pending') # 桥接模型的其他额外字段
修改序列化器代码
核心是在RunBuildSerializer中嵌套已有的BuildSerializer,再让RunSerializer使用这个更新后的序列化器:
# serializers.py from rest_framework import serializers from .models import Build, Run, RunBuild # 你已有的Build序列化器,无需修改 class BuildSerializer(serializers.ModelSerializer): class Meta: model = Build fields = '__all__' # 或指定你需要返回的字段列表 # 更新RunBuild序列化器,嵌套Build详情 class RunBuildSerializer(serializers.ModelSerializer): # 直接嵌套BuildSerializer,替代默认的主键返回 build = BuildSerializer(read_only=True) # read_only=True确保只用于展示,不影响写入 class Meta: model = RunBuild fields = '__all__' # 或指定字段,比如['id', 'status', 'build'] # Run序列化器关联更新后的RunBuildSerializer class RunSerializer(serializers.ModelSerializer): run_builds = RunBuildSerializer(many=True, read_only=True) class Meta: model = Run fields = '__all__' # 或指定需要返回的Run字段+run_builds
补充说明
- 如果你需要在创建/更新RunBuild时传入Build主键,同时返回完整Build数据,可以给
RunBuildSerializer做如下调整:
这样写入时传build的ID,返回时会通过class RunBuildSerializer(serializers.ModelSerializer): build_detail = BuildSerializer(source='build', read_only=True) build = serializers.PrimaryKeyRelatedField(queryset=Build.objects.all()) class Meta: model = RunBuild fields = ['id', 'status', 'build', 'build_detail']build_detail字段展示完整Build数据。 - 确保
Run模型中RunBuild的related_name(示例中的run_builds)和序列化器中使用的字段名一致,否则会找不到关联数据。
内容的提问来源于stack exchange,提问作者alesssz
相关产品推荐
相关产品推荐

