Skip to main content
 首页 » 编程设计

python之Django之覆盖模型保存()

2025年05月04日29zhenyulu

在我们的项目中,我们使用软删除(模型上的 is_deleted 属性)。 在创建新模型之前,我想首先检查它是否已经存在并被删除,如果是 - 设置 is_deleted=False 并保存已经存在的模型。 所以我决定重写模型的“保存”方法。 (不是 View 创建,因为它不仅适用于请求) 问题是所有操作(创建、更新、删除)都会调用“save()”。 有没有一种方法可以仅在创建时调用覆盖的方法?

class Model(BaseModel): 
    title = models.CharField(max_length=200) 
    identifier = models.CharField(max_length=15) 
 
    def save(self, *args, **kwargs): 
        try:                                                
            existing_model = Model.objects.active_and_deleted().get(                                                        identifier=self.identifier) 
 
            if self.is_deleted is False: 
                existing_model.is_deleted = False 
                existing_model.title = self.title 
                existing_model.created_at = self.created_at 
                existing_model.updated_at = self.updated_at 
                existing_model.created_by = self.created_by 
                existing_model.deleted_at = None 
                super(Model, existing_model).save(args, kwargs) 
        except Model.DoesNotExist: 
            # in case the Nodel wasn't already exist - continue 
            pass 
        super(Model, self).save(*args, **kwargs) 

请您参考如下方法:

您问题的答案“有没有一种方法可以只在创建时调用重写的方法?”这是:

    def save(self, *args, **kwargs): 
 
        if not self.id: 
            # Object is a new instance 
 
        return super(Model, self).save(*args, **kwargs) 

但是这里还有其他问题。例如,您的模型不应命名为“模型”。