Can İlgu
Can İlgu

Reputation: 147

Create serializer fields according to the data in Django Rest

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

Answers (1)

Jordan Kowal
Jordan Kowal

Reputation: 1594

The best solution would be to have 2 separate serializers:

  • Make 2 different serializers, each with its own logic and fields
  • If some logic is shared between both serializers, simply create a parent class with the shared logic, and make them inherit from it
  • In your view, simply pick the serializer based on your need, like so:
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

Related Questions