Reputation: 1858
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
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
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
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