from django.db import models from django.utils import timezone class BaseManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_deleted=False) class BaseModel(models.Model): """ 基础模型,所有模型都继承此模型 """ id = models.BigAutoField(primary_key=True, verbose_name="Id", help_text="主键id") description = models.TextField( null=True, blank=True, verbose_name="描述", help_text="描述" ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") is_deleted = models.BooleanField(default=False, verbose_name="是否删除") deleted_at = models.DateTimeField(null=True, blank=True, verbose_name="删除时间") objects = BaseManager() class Meta: abstract = True # 将此模型设为抽象模型,方便其他模型继承 verbose_name = "基础模型" def get_all_fields(self): return self._meta.fields exclude_fields = [ "id", "description", "created_at", "updated_at", "is_deleted", "deleted_at", ] def get_need_fields_names(self): return [ field.name for field in self.get_all_fields() if field.name not in self.exclude_fields ] def to_dict_data(self): """ 需要导出的字段(去除不包含字段)(注意与to_data区分) """ return {field: getattr(self, field) for field in self.get_need_fields_names()} @property def DICT_DATA(self): return self.to_dict_data() def insert(self, request): """ 插入模型 """ assert ( self.pk is None ), f"模型{self.__class__.__name__}还没有保存到数据中,不能手动指定ID" return self.__class__._default_manager.create(**self.DICT_DATA) def update(self, request, update_data: dict[str, any] = None): """ 更新模型 """ assert isinstance(update_data, dict), "update_data必须为字典" for key, value in update_data.items(): # 不允许修改id字段 if key in ["id"]: continue if hasattr(self, key): setattr(self, key, value) self.save() return self def delete(self, using=None, keep_parents=False): """ 逻辑删除方法,设置 deleted_at 为当前时间 """ self.is_deleted = True self.deleted_at = timezone.now() self.save() def hard_delete(self): """ 物理删除方法,真正删除数据 """ super(BaseModel, self).delete()