fix: 完善父子关系parent_link处理

This commit is contained in:
caoqianming 2024-06-05 12:49:52 +08:00
parent a590eb298b
commit 7b1013ea64
1 changed files with 39 additions and 18 deletions

View File

@ -5,6 +5,7 @@ from django.db.models import Model
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from apps.utils.snowflake import idWorker from apps.utils.snowflake import idWorker
from django.db import IntegrityError from django.db import IntegrityError
from django.db import transaction
# 自定义软删除查询基类 # 自定义软删除查询基类
@ -58,11 +59,31 @@ class ParentModel(models.Model):
on_delete=models.SET_NULL, verbose_name='', db_constraint=False) on_delete=models.SET_NULL, verbose_name='', db_constraint=False)
parent_link = models.JSONField('父级关联', default=list, blank=True, editable=False) parent_link = models.JSONField('父级关联', default=list, blank=True, editable=False)
def handle_parent(self): def init_parent_link(self):
if hasattr(self, "parent_link") and self.parent: link = []
new_link = self.parent.parent_link if self.parent is not None:
new_link.append(self.parent.id) link = [self.parent.id] # 一级
self.parent_link = new_link if self.parent.parent is not None: # 二级
link.insert(0, self.parent.parent.id)
if self.parent.parent.parent is not None: # 三级
link.insert(0, self.parent.parent.parent.id)
if self.parent.parent.parent.parent is not None:
raise Exception('最多支持四级')
return link
def handle_parent(self, is_create:bool):
if hasattr(self, "parent_link"):
old_parent = None
if not is_create:
old_parent = self.__class__.objects.get(id=self.id).parent
if old_parent != self.parent:
"""
处理父级关系
"""
self.parent_link = self.init_parent_link()
self.__class__.objects.get_queryset(all=True).filter(parent=self.id).update(
parent_link = self.parent_link + [self.id]
)
class Meta: class Meta:
abstract = True abstract = True
@ -83,27 +104,27 @@ class BaseModel(models.Model):
class Meta: class Meta:
abstract = True abstract = True
def handle_parent(self): def handle_parent(self, is_create):
pass pass
def save(self, *args, **kwargs) -> None: def save(self, *args, **kwargs) -> None:
# 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留 # 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留
gen_id = False is_create = False
if not self.id: if not self.id:
gen_id = True is_create = True
self.id = idWorker.get_id() self.id = idWorker.get_id()
with transaction.atomic():
# 处理父级
self.handle_parent(is_create)
# 处理父级 try:
self.handle_parent()
try:
return super().save(*args, **kwargs)
except IntegrityError as e:
if gen_id:
time.sleep(0.01)
self.id = idWorker.get_id()
return super().save(*args, **kwargs) return super().save(*args, **kwargs)
raise e except IntegrityError as e:
if is_create:
time.sleep(0.01)
self.id = idWorker.get_id()
return super().save(*args, **kwargs)
raise e
class SoftModel(BaseModel): class SoftModel(BaseModel):