class DynamicFieldsModelSerializer(ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` and 'exclude' argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
exclude = kwargs.pop('exclude', None)
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
if exclude is not None:
not_allowed = set(exclude)
for exclude_name in not_allowed:
self.fields.pop(exclude_name)
class UserCreateSerializer(DynamicFieldsModelSerializer):
class Meta:
model = User
fields = ('username', 'tel', 'email', 'password')
:
serializer = UserCreateSerializer(data=request.data, fields=('username', 'password', 'tel'))
serializer = UserCreateSerializer(data=request.data, fields=('username', 'password', 'email'))