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
相关产品推荐
相关产品推荐

