my-django/utils/model.py
Kai ef578a697b
All checks were successful
test / build (push) Successful in 7s
test / deploy (push) Successful in 2s
refactor: clean up code formatting in various files for improved readability
2025-03-24 20:03:17 +08:00

87 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()