You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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做如下调整:
    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的ID,返回时会通过build_detail字段展示完整Build数据。
  • 确保Run模型中RunBuild的related_name(示例中的run_builds)和序列化器中使用的字段名一致,否则会找不到关联数据。

内容的提问来源于stack exchange,提问作者alesssz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:23:20