Как динамически установить варианты поля выбора в сериализаторе 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 для использования в поле выбора