【问题标题】:Cancel a save from save method in django models从 django 模型中的保存方法中取消保存
【发布时间】: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


【解决方案1】:

你应该提出一个错误,例如 ValidationError

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2014-07-19
    • 2015-02-24
    相关资源
    最近更新 更多