Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-serializer

Django: Return serializer ValidationError in Model save() method


I use django-rest-framework to create Rest API within Django framework. And it's possible to return any validationError beside serializer methods.

But, I was wondering is it possible to return errors from save() method of django model that be translated to django rest validationError?

For example imagine I want to limit creating objects on a specific table. like this:

class CustomTable(models.Model):
    ... # modles fields go here

    def save():
        if CustomTable.objects.count() > 2:
             # Return a validationError in any serializer that is connected to this model.

Note I could use raise ValueError or raise ValidationError, but they all cause 500 error on endpoint. But i want to return a response in my api view that says for example 'limit reached'


Solution

  • The DRF ValidationError is handled in the serializer so you should catch any expected errors when calling your model's save method and use it to raise a ValiddationError.

    For example, you could do this in your serializer's save method:

    def save(self, **kwargs):
        try:
            super().save(**kwargs)
        except ModelError as e:
            raise serializers.ValidationError(e)
    

    Where ModelError is the error you're raising in your model