Как динамически установить варианты поля выбора в сериализаторе django DRF через метод __init__ или __new__?

Я пытаюсь динамически установить выбор поля выбора в классе сериализатора django

Я хочу передать ему варианты выбора (динамически), а он установит их за меня

Упрощенная версия проекта выглядит следующим образом

# urls
urlpatterns = [
    path("cat", CatView.as_view(), name="cat")
]
    

Я пробовал разные способы, но они не работают. Я делюсь одним из них здесь

Мне даже пришлось использовать приватные методы (которые я бы предпочел не использовать) поля, но все равно не удалось

# serializers
class CatSerializer(serializers.Serializer):
    name = serializers.ChoiceField(choices=[])

    def __new__(cls, *args, **kwargs):
        name_choices = kwargs["names"]
        f = CatSerializer._declared_fields["name"]
        f._set_choices(name_choices)
        f.__dict__["_kwargs"]["choices"] = name_choices
        obj = super().__new__(cls)

        return obj

    def __init__(self, *args, **kwargs):
        kwargs.pop("names")
        super().__init__(self, *args, **kwargs)
# views
class CatView(APIView):

    def __init__(self, *arg, **kwargs):
        super().__init__(*arg, **kwargs)
        self.names = ['a', 'b', 'c']

    def get_serializer(self, *args, **kwargs):
        serializer_class = CatSerializer
        return serializer_class(
            *args, **kwargs,
            names=self.names
        )

    def post(self, request):

        request_body = request.body
        serializer = self.get_serializer(
            data=json.loads(request_body),
        )
        is_data_valid = serializer.is_valid()
        if is_data_valid:
            serialized_data = serializer.data
            return Response({"message": "success", "serialized-data": serialized_data})
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Теперь я вижу эту ошибку:

AttributeError: Got AttributeError when attempting to get a value for field `name` on serializer `CatSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `CatSerializer` instance.
Original exception text was: 'CatSerializer' object has no attribute 'name'.

происходит сбой в представлениях, когда он пытается получить данные здесь serialized_data = serializer.data

это еще один вопрос с некоторыми вариациями, который я еще не догадался решить и не получил ответа. проблема инициализации сериализатора django с дополнительными vars для использования в поле выбора

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