Создайте поля сериализатора в соответствии с данными в Django Rest

Я пишу api для Auth. и у меня есть 2 типа пользователей (Donors, Charity), когда они регистрируются, мои данные меняются. Так что мне нужно обновить мои поля в соответствии с данными.

Вот что я сделал на данный момент.

views.py

class RegisterView(APIView):
    def post(self, request):
        js_data = request.data


        if 'last_name' in js_data:
            #fields = ['id', 'email', 'first_name', 'last_name', 'password']
            serializer = UserSerializer(data=js_data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
        else:
          #fields = ['id', 'email', 'first_name', 'postcode', 'password']
          serializer = UserSerializer(data=js_data)
          serializer.is_valid(raise_exception=True)
          serializer.save()

в views.py я пытался определить поля извне serializers.py, но не могу отправить поля в качестве параметра.

serializer = UserSerializer(data=js_data, fields = fields) # gives error. также я попробовал вот это;

serializer = UserSerializer(data=js_data, many= True, fields = fields) # gives error

Я пытаюсь создать поля динамически.

serializer.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = []
        extra_kwargs = {'password': {'write_only': True} }

    def create(self, validated_data):
        if 'last_name' in validated_data:
            self.Meta.fields = ['id', 'email', 'first_name', 'last_name', 'password']
        else:
            self.Meta.fields = ['id', 'email', 'first_name', 'postcode', 'password']
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)


        if password is not None:
           instance.set_password(password)
        instance.save()

        return instance

Здесь я попытался изменить поля в функции create. Я не получаю ошибку, но в базе данных мои поля пусты :( Возможно, я определяю fields = [] как пустой список, поэтому поля пусты и не сохраняются данные пользователя.

Btw, я начал изучать django rest. Я новичок в этом фреймворке, так что извините за любое ложное определение или т.д.

Есть идеи по созданию полей в соответствии с данными? Заранее спасибо. Хорошего дня.

Лучшим решением было бы иметь 2 отдельных сериализатора:

  • Создайте 2 разных сериализатора, каждый со своей логикой и полями
  • .
  • Если какая-то логика является общей для обоих сериализаторов, просто создайте родительский класс с общей логикой, и пусть они наследуют от него
  • .
  • В вашем представлении просто выберите сериализатор, основываясь на ваших потребностях, как например:
if 'last_name' in js_data:
    serializer = SerializerOne(data=js_data)
else:
    serializer = SerializerTwo(data=js_data)
serializer.is_valid(raise_exception=True)
serializer.save()

Наличие двух отдельных сериализаторов сделает код чище и проще для понимания и сопровождения

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