【发布时间】:2021-05-14 11:59:56
【问题描述】:
所以我有 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)
提前谢谢你:)
【问题讨论】:
标签: django django-models