Создайте поля сериализатора в соответствии с данными в 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()
Наличие двух отдельных сериализаторов сделает код чище и проще для понимания и сопровождения