Django Nested Serializer - Возврат Null поля, если условие выполнено

У меня есть вложенный сериализатор, содержимое которого мне нужно вернуть как Null в случае, если поле родительского сериализатора "is_profile_private" (булево) равно True. Я пробовал использовать get_queryset для фильтрации профиля пользователя, но прогресса не было. Пробовал использовать SerializerMethordField() и get_profile(), но Django пожаловался, что тип объекта UserProfileSerializer не может быть сериализован.

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):
    profile = UserProfileSerializer(source="user", required=False)

    class Meta:
        model = User
        fields = (
            "id",
            "name",
            "username",
            "is_profile_private",
            "date_joined",
            "profile",
        )

views.py

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

    @staticmethod
    def get(request, *args, **kwargs):
        return User.objects.get(id=str(request.data))

Вы можете использовать SerializerMethodField:

class SimpleUserSerializer(UserSerializer):
    profile = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            "id",
            "name",
            "username",
            "is_profile_private",
            "date_joined",
            "profile",
        )

    def get_profile(self, obj):
        if obj.is_profile_private:
            return None
        return UserProfileSerializer(obj.user).data

обратите внимание, что вы должны возвращать данные сериализатора, а не сам сериализатор.

Вернуться на верх