my-django/utils/model.py
Kai 5d9073c19c
Some checks failed
test / build (push) Has been cancelled
test / deploy (push) Has been cancelled
test / release (push) Has been cancelled
first commit
2025-03-21 17:45:04 +08:00

95 lines
2.8 KiB
Python
Raw Permalink 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()