read_only, write_only, required, default, initial, source,
label, help_text, style, error_messages, allow_empty,
instance, data, partial, context, allow_null
Let's take an example to understand it more clearly.
Case: Send an email to any user with given content but, do not send email to the specific list of emails.
For this case, we need to validate the email and raise an error if it is in excluded emails list. To do this we need to have excluded emails list in serializers. We can achieve this by using "context" argument of the serializer.
serializers.py
from rest_framework import serializers
class SendEmailSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
def validate_email(self, email):
# .....
exclude_email_list = self.context.get("exclude_email_list", [])
if email in exclude_email_list:
raise serializers.ValidationError("We cannot send an email to this user")
# .....
return email
Rest framework supports both function based views(FBV) and generic views(class-based views CBV).
views.py
# Passing the extra context data to serializers in FBV style.
from rest_framework.decorators import api_view
from your_app.serializers import SendEmailSerializer
@api_view(['POST'])
def send_email_view(request):
# .....
context = {"exclude_email_list": ['[email protected]', '[email protected]']}
serializer = SendEmailSerializer(data=request.data, context=context)
# ....
# Passing the extra context data to serializers in generic CBV or ViewSets style
#ViewSets
from rest_framework import viewsets
class SendEmailViewSet(viewsets.GenericViewSet):
# ......
def get_serializer_context(self):
context = super(CommentViewSet, self).get_serializer_context()
context.update({
"exclude_email_list": ['[email protected]', '[email protected]']
# extra data
})
return context
# .......
#Generic Views
from rest_framework import generics
class SendEmailView(generics.GenericAPIView):
# ......
def get_serializer_context(self):
context = super(CommentViewSet, self).get_serializer_context()
context.update({
"exclude_email_list": ['[email protected]', '[email protected]']
# extra data
})
return context
# .......
{
'request': self.request,
'format': self.format_kwarg,
'view': self
}