ritratt
ritratt

Reputation: 1858

Why is `data` empty in nested serializer validate method?

I am using Django REST Framework. I have a parent serializer class like so:

class MyParentSerializer(serializers.Serializer):

  # Use custom serializer as a field.
  my_field = MyFieldSerializer(
      required=False,
  )

  name = serializers.Charfield()
}

  def validate(data):
    # validation logic

And then my child serializer that is used above looks like this:

class MyFieldSerializer(serializers.Serializer):

    email_address = serializers.ListField(
        required=False,
        child=serializers.CharField(),
    )

    phone_number = serializers.ListField(
        required=False,
    )

    def validate(self, data):
        data <-- <-- This is empty if I pass in random invalid data!
        check_for_undefined_fields(self.data, self.fields)
        return data

Now, I pass the following data:

{
  "my_field": { "invalid_field": "foo"},
  "name": "bar"
}

However, if I check data in the validate method in my MyFieldSerializer class during validation, IT'S EMPTY!

Why? How can I fix this so that data is actually the data I passed?

Upvotes: 2

Views: 1612

Answers (3)

Sarthak Bhatia
Sarthak Bhatia

Reputation: 1

In the nested serializer, you might be writing the nested field in create which you have set to read_only=True. Change that to read_only=False will solve the problem.

For e.g: question_response = QuestionResponseSerializer(many=True, read_only=True)

Change this to: question_response = QuestionResponseSerializer(many=True, read_only=False)

Upvotes: 0

Mirza715
Mirza715

Reputation: 420

You are not using ModelSerializer so every field in request have to be added in Serializer. In you case you just have to define invalid_field

  class MyFieldSerializer(serializers.Serializer):

    email_address = serializers.ListField(
        required=False,
        child=serializers.CharField(),
    )

    phone_number = serializers.ListField(
        required=False,
    )
    invalid_field = serializers.CharField()

    def validate(self, data):
        data <-- <-- This is empty if I pass in random invalid data!
        check_for_undefined_fields(self.data, self.fields)
        return data

Upvotes: 2

Muhammad Hassan
Muhammad Hassan

Reputation: 14391

Only fields which you have declared will be available in validate or is_valid or create methods. If you need to access those fields, you can use self.initial_data.

Upvotes: 2

Related Questions