所以我有django模型,我想覆盖save,这样它只在某些实例上保存。有没有一种方法可以避免在满足条件的情况下发生保存?其思想是,如果使用if语句定义的某些条件未得到满足,实例将无法保存。例如,如果没有足够的服务员,我们就取消保存,或者如果没有足够的表,我们也会这样做。
下面是我的代码:
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)提前感谢您:)
发布于 2021-02-11 04:35:31
您应该引发一个错误,例如ValidationError
https://stackoverflow.com/questions/66142978
复制相似问题