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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:03