首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消django模型中的save from save方法

取消django模型中的save from save方法
EN

Stack Overflow用户
提问于 2021-02-11 02:35:16
回答 1查看 35关注 0票数 0

所以我有django模型,我想覆盖save,这样它只在某些实例上保存。有没有一种方法可以避免在满足条件的情况下发生保存?其思想是,如果使用if语句定义的某些条件未得到满足,实例将无法保存。例如,如果没有足够的服务员,我们就取消保存,或者如果没有足够的表,我们也会这样做。

下面是我的代码:

代码语言:javascript
复制
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)

提前感谢您:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-11 04:35:31

您应该引发一个错误,例如ValidationError

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66142978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档