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

使用Django Rest Framework序列化多关联模型数据的更优方案

优化DRF嵌套数据序列化的方案

行业标准方案就是利用DRF的嵌套序列化器,完全基于模型和序列化器构造响应,彻底避免手动构造对象和冗余循环。以下是具体实现步骤:

假设模型结构(根据预期JSON推断)

先明确你的模型关联关系,示例如下:

from django.db import models

class Word(models.Model):
    word = models.CharField(max_length=255)

class Entry(models.Model):
    word = models.ForeignKey(Word, on_delete=models.CASCADE, related_name='entries')
    tag = models.CharField(max_length=255, null=True, blank=True)
    link = models.URLField(blank=True)
    value = models.CharField(max_length=255)

1. 定义嵌套子序列化器

先实现Entry模型的序列化器,对应JSON里的entries数组元素:

from rest_framework import serializers

class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ['tag', 'link', 'value']

2. 定义主序列化器

在Word的序列化器中,通过模型的related_name关联嵌套序列化器,直接生成预期结构:

class WordSerializer(serializers.ModelSerializer):
    entries = EntrySerializer(many=True, read_only=True)

    class Meta:
        model = Word
        fields = ['word', 'entries']

3. 简化视图实现

视图中直接查询模型(用prefetch_related优化查询性能),用主序列化器序列化即可:

from rest_framework.views import APIView
from rest_framework.response import Response

class WordListView(APIView):
    def get(self, request):
        # 预加载关联的entries,避免N+1查询问题
        words = Word.objects.prefetch_related('entries').all()
        serializer = WordSerializer(words, many=True)
        return Response(serializer.data)

核心优势

  • 完全贴合DRF设计理念,代码简洁无冗余,无需手动构造对象和循环
  • 自动处理空entries数组(当Word无关联Entry时,序列化器自动返回空数组,匹配预期格式)
  • 借助prefetch_related优化数据库查询,提升接口性能
  • 易于维护扩展,后续修改字段或关联逻辑只需调整序列化器或模型

适配调整说明

如果你的模型关联方式不同,只需微调序列化器:

  • 若关联字段未设置related_name,可使用默认的模型名_set(比如entry_set)
  • 若需要自定义字段默认值(比如link默认空字符串),可在序列化器中显式声明:link = serializers.CharField(default='', allow_blank=True),或直接在模型层面设置默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:02:16