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

Django嵌套Serializer满足指定条件时返回Null字段的实现问题

问题解决方法

1 错误原因分析

  • 你之前使用SerializerMethodField报错是因为直接返回了UserProfileSerializer类的实例,没有调用序列化器的.data属性获取序列化后的字典结构,Django无法直接序列化序列化器对象
  • 原有嵌套序列化器默认会直接返回关联数据,没有做字段级的权限判断,因此需要自定义序列化逻辑

2 修正后的serializers.py代码

class UserProfileSerializer(UserSerializer):
    height = serializers.SerializerMethodField()

    class Meta:
        model = UserProfile
        fields = (
            "bio",
            "gender",
            "custom_gender",
            "non_binary_list",
            "birthdate",
            "avatar",
            "height",
            "hometown",
            "zodiac_sign",
            "language",
        )

    @staticmethod
    def get_height(obj):
        return {"value": obj.height, "unit": obj.height_unit}


class SimpleUserSerializer(UserSerializer):
    # 替换为SerializerMethodField自定义返回逻辑
    profile = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            "id",
            "name",
            "username",
            "is_profile_private",
            "date_joined",
            "profile",
        )
    
    def get_profile(self, obj):
        # obj为当前序列化的User实例
        if obj.is_profile_private:
            return None
        # 如果你的User和UserProfile关联字段名称不是user,可根据实际关联关系调整传入的参数
        return UserProfileSerializer(obj.user, context=self.context).data

3 修正后的views.py代码

原有自定义get方法逻辑错误,继承RetrieveModelMixin后不需要自己实现get逻辑,框架会自动处理序列化流程,修正后代码:

class UserProfileAPIView(RetrieveModelMixin, GenericViewSet):
    lookup_field = "id"
    queryset = User.objects.all()
    serializer_class = SimpleUserSerializer
    http_method_names = ["get"]

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

效果说明

  • 当查询的用户is_profile_private字段值为True时,返回的profile字段值为null
  • 当is_profile_private为False时,正常返回UserProfileSerializer序列化后的完整用户资料数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:39:03