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

DRF获取用户组名称问题:显示NULL而非组名的原因及解决

解决DRF中用户组名称显示为NULL的问题

嘿,我帮你分析下问题所在哈~你遇到的groups返回NULL的原因很简单:User和Group是多对多关联关系,所以obj.groups并不是单个Group对象,而是一个QuerySet(一组Group实例),直接访问.name自然会返回None——因为QuerySet本身没有name这个属性呀!

下面给你几种正确获取用户组名称的方式,按需选择:

方法1:用SerializerMethodField返回组名列表

这是最灵活的方式,适合需要自定义返回格式的场景:

from django.contrib.auth import get_user_model
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    groups = serializers.SerializerMethodField()

    def get_groups(self, obj):
        # 遍历所有关联的组,提取名称组成列表
        return [group.name for group in obj.groups.all()]

    class Meta:
        model = get_user_model()
        fields = ['id', 'username', 'first_name', 'groups']

方法2:用StringRelatedField快速返回组名

如果你的Group模型的__str__方法已经返回了组名称(默认Django的Group模型__str__就是返回name),可以直接用DRF内置的StringRelatedField,代码更简洁:

from django.contrib.auth import get_user_model
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    groups = serializers.StringRelatedField(many=True)

    class Meta:
        model = get_user_model()
        fields = ['id', 'username', 'first_name', 'groups']

方法3:嵌套Serializer返回更完整的组信息

如果需要同时返回组的ID和名称(或者其他字段),可以写一个嵌套的GroupSerializer:

from django.contrib.auth import get_user_model, Group
from rest_framework import serializers

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ['id', 'name']

class UserSerializer(serializers.ModelSerializer):
    groups = GroupSerializer(many=True)

    class Meta:
        model = get_user_model()
        fields = ['id', 'username', 'first_name', 'groups']

核心要点就是记住:多对多关联的字段访问时,一定要用.all()来获取所有关联对象,再进行遍历或者用DRF提供的多字段处理方式,不能直接像访问单个对象属性那样操作哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:16