Search code examples
pythondjangovalidationmodel

How to use validator in Django depending on the database data?


I'm making a web app that keeps tracks of a small business. For that purpose I have two models designed in my app. One of which is all the storage information and the other is for each selling orders, like:

class Storage(models.Model):
    name = models.CharField('product name', max_length=64)
    quantity = models.DecimalField('inventory', max_digits=6, decimal_places=4, default=0)

class Orders(models.Model):
    product = models.ForeignKey('Storage', on_delete=models.CASCADE)
    volumn = models.DecimalField('order volumn', max_digits=6, decimal_places=4, default=0)

I want a validator for my Orders class so that the input value for 'volumn' from the form doesn't exceed the corresponding quantity data in the Storage class. How can I achieve that? Thanks!


Solution

  • welcome to StackOverlow. This is my first answer so if it works i would appreciate if you can click "accept as answer"

    You can use clean() method for your model. More here:

    https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddo#id1

    from django.db import models 
    from django.core.exceptions import ValidationError
    
    class Storage(models.Model):
        name = models.CharField('product name', max_length=64)
        quantity = models.DecimalField('inventory', max_digits=6, decimal_places=4, default=0)
    
    class Orders(models.Model):
        product = models.ForeignKey('Storage', on_delete=models.CASCADE,related_name='storage')
        volumn = models.DecimalField('order volumn', max_digits=6, decimal_places=4, default=0)
    
        def clean(self):
            # Don't allow volumn to be bigger than quantity in Storage
            if  self.volumn > self.product.quantity :
                raise ValidationError({'volumn': ('Volumn cannot be bigger than storage quantity')})