Reputation: 147
I am writing an api for Auth. and I have 2 user types ( Donors , Charity ) when they did registration my data is changing. So that I need to update my fields according to the data.
Here is what I did so far.
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()
in views.py I tried to define fields from outside serializers.py but I can't send fields as a parameter.
serializer = UserSerializer(data=js_data, fields = fields) # gives error.
also I tried this one;
serializer = UserSerializer(data=js_data, many= True, fields = fields) # gives error
So I am trying to create fields dynamically.
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
So in here I tried to change fields in create function. I am not getting an error but in database my fields are empty :( Maybe I define fields = []
as a empty list thats why fields are empty and not saving any data of user.
Btw, I started to learn django rest. I new at this framework so that I am sorry to any false definition or etc..
So any ideas to create fields according the data? Thanks in advance. Have a nice day.
Upvotes: 1
Views: 1180
Reputation: 1594
The best solution would be to have 2 separate serializers:
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()
Having 2 separate serializer will make the code cleaner and easier to understand and maintain
Upvotes: 1