Skip to content

Instantly share code, notes, and snippets.

@pmburu
Forked from twidi/drf_utils.py
Created May 3, 2020 00:45
Show Gist options
  • Save pmburu/63bd44290af958f6cd6b16c21345cd83 to your computer and use it in GitHub Desktop.
Save pmburu/63bd44290af958f6cd6b16c21345cd83 to your computer and use it in GitHub Desktop.
Make Django Rest Framework correctly handle Django ValidationError raised in the save method of a model
"""
Sometimes in your Django model you want to raise a ``ValidationError`` in the ``save`` method, for
some reason.
This exception is not managed by Django Rest Framework because it occurs after its validation
process. So at the end, you'll have a 500.
Correcting this is as simple as overriding the exception handler, by converting the Django
``ValidationError`` to a DRF one.
"""
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework.exceptions import ValidationError as DRFValidationError
from rest_framework.views import exception_handler as drf_exception_handler
def exception_handler(exc, context):
"""Handle Django ValidationError as an accepted exception
Must be set in settings:
>>> REST_FRAMEWORK = {
... # ...
... 'EXCEPTION_HANDLER': 'mtp.apps.common.drf.exception_handler',
... # ...
... }
For the parameters, see ``exception_handler``
"""
if isinstance(exc, DjangoValidationError):
exc = DRFValidationError(detail=exc.message_dict)
return drf_exception_handler(exc, context)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment