Last active
September 22, 2017 16:04
-
-
Save davesque/618910e55ccf02cbd1a8cff385768c25 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from rest_framework import serializers | |
| from rest_framework.fields import empty | |
| from rest_framework.settings import api_settings | |
| empty_whitelist = set() | |
| class KnownFieldsMixin: | |
| """ | |
| Django REST Framework `Serializer` class mixin that provides a | |
| `run_validation` method which requires that no unknown fields are present | |
| in serialized data. | |
| """ | |
| @classmethod | |
| def get_unknown_fields_whitelist(cls): | |
| try: | |
| return cls._unknown_fields_whitelist | |
| except AttributeError: | |
| pass | |
| Meta = getattr(cls, 'Meta', None) | |
| try: | |
| raw_whitelist = Meta.unknown_fields_whitelist | |
| except AttributeError: | |
| whitelist = empty_whitelist | |
| else: | |
| whitelist = set(raw_whitelist) | |
| cls._unknown_fields_whitelist = whitelist | |
| return whitelist | |
| def run_validation(self, data=empty): | |
| if data is not empty: | |
| unknown_fields = ( | |
| set(data.keys()) - | |
| set(self.fields.keys()) - | |
| self.get_unknown_fields_whitelist() | |
| ) | |
| if unknown_fields: | |
| errors = ['Unknown fields: {}'.format(', '.join(unknown_fields))] | |
| raise serializers.ValidationError({ | |
| api_settings.NON_FIELD_ERRORS_KEY: errors, | |
| }) | |
| return super().run_validation(data) | |
| class KnownFieldsSerializer(KnownFieldsMixin, serializers.Serializer): | |
| pass | |
| class KnownFieldsModelSerializer(KnownFieldsMixin, serializers.ModelSerializer): | |
| pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment