如何使用Django REST Framework将一对多关系序列化为主键值列表
Django REST Framework 一对多关联单字段序列化方案
你需要将Album关联Track的单个字段序列化为纯值列表,可通过以下两种常用方案实现:
方案1:使用SlugRelatedField(推荐,最简实现)
这是DRF原生支持的最优方案,无需自定义额外逻辑,直接指定关联对象要提取的字段即可:
from rest_framework import serializers from .models import Album class AlbumSerializer(serializers.ModelSerializer): tracks = serializers.SlugRelatedField( many=True, read_only=True, slug_field='duration' # 指定要提取的Track字段名 ) class Meta: model = Album fields = ['album_name', 'artist', 'tracks']
方案2:使用SerializerMethodField(适合需要自定义逻辑的场景)
如果需要对关联数据做过滤、运算等自定义处理,可使用该方案:
from rest_framework import serializers from .models import Album class AlbumSerializer(serializers.ModelSerializer): tracks = serializers.SerializerMethodField() def get_tracks(self, obj): # values_list加flat=True直接返回单字段值的迭代器,转列表即可 return list(obj.tracks.values_list('duration', flat=True)) # 如需过滤可改为: # return list(obj.tracks.filter(duration__gt=10).values_list('duration', flat=True)) class Meta: model = Album fields = ['album_name', 'artist', 'tracks']
性能优化提示
查询Album数据集时加上prefetch_related预加载关联的Track数据,避免产生N+1查询问题:
# 视图中查询示例 album_queryset = Album.objects.all().prefetch_related('tracks')
内容的提问来源于stack exchange,提问作者jdinunzio
相关产品推荐
相关产品推荐

