0

So I have django model and I want to override save so that it only saves on certain instances. Is there a way to avoid a save from happening if a condition is met? The idea is if certain conditions defined with an if statement aren't met the instance fails to be saved. so for instance if there is not enough waiters we cancel the save, or if there is not enough tables we do the same.

Here's my code:

class Service(models.Model):
    id = models.AutoField(primary_key=True)
    arrival = models.DateTimeField(auto_now_add=True)
    exit = models.DateTimeField(null=True, blank=True)
    waiter = models.ForeignKey('Waiter', on_delete=models.CASCADE)
    table = models.ForeignKey('Table', on_delete=models.CASCADE)
    total_ammount= models.DecimalField(max_digits=15, decimal_places=2)
    
    def save(self, *args, **kwargs):
        if self.id == None:
            time = datetime.datetime.now()

            # check for waiters
            waiters = Waiter.objects.select_related().annotate(num_Service=Count('service', filter=Q(service__exit__gt=time))).all()
            available_waiters = waiters.filter(num_Service__lt=4)
            avalable_waiters_length = len(available_waiters)
            # check for tables
            tables = Table.objects.select_related().annotate(num_Service=Count('service', filter=Q(service__exit__gt=time))).all()
            available_tables = tables.filter(num_Service__lt=1)
            avalable_tables_length = len(available_tables)
            # return exception if a problem arises
            if avalable_tables_length == 0 and avalable_waiters_length == 0:
                print("not enough waiters or tables")
            if avalable_waiters_length == 0:
                print("not enough waiters")
                return
            if avalable_tables_length == 0:
                print("not enough tables")
                return
            # assign waiter and table
            waiter_obj = random.choice(available_waiters)
            self.waiter = waiter_obj
            table_obj = random.choice(available_tables)
            self.table = table_obj

            print(time.time())
            # check if current time is open
            if datetime.time(9,0) < time.time() and time.time()> datetime.time(21, 30):
                print("The restaurant is closed")
                return

            print(time.time())
            # add timedelta to init_time
            if time.time() < datetime.time(17,0):
                print(time + datetime.timedelta(minutes=90))
                self.exit = time + datetime.timedelta(minutes=90)
            if time.time() > datetime.time(17,0):
                self.exit = time + datetime.timedelta(minutes=120)

            #finalize pre_save
            return super(Service, self).save(*args, **kwargs)

Thank you in advance :)

paula.em.lafon
  • 553
  • 2
  • 6
  • 15

1 Answers1

2

you should raise an error, like ValidationError for example

katek1094
  • 82
  • 1
  • 8