Skip to content

Instantly share code, notes, and snippets.

@davesque
Last active September 22, 2017 16:04
Show Gist options
  • Select an option

  • Save davesque/618910e55ccf02cbd1a8cff385768c25 to your computer and use it in GitHub Desktop.

Select an option

Save davesque/618910e55ccf02cbd1a8cff385768c25 to your computer and use it in GitHub Desktop.
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