Reza Torkaman Ahmadi
Reza Torkaman Ahmadi

Reputation: 3038

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'

Upvotes: 4

Views: 2465

Answers (2)

Ken4scholars
Ken4scholars

Reputation: 6296

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

Upvotes: 6

AjayShelar
AjayShelar

Reputation: 462

There's are two to three ways to do this

1.Using clean method.

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

    def clean(self):
     if CustomTable.objects.count() > 2:
                raise ValidationError(_('custom table can not have more than two entries.'))
  1. Using Signals.

    @receiver(pre_save, sender= CustomTable)
    def limit(sender, **kwargs):
          if CustomTable.objects.count() > 2:
                raise ValidationError(_('Custom table can not have more than two entries.'))
    

Upvotes: 1

Related Questions