feat: base 处理父级引用parent_link bug
This commit is contained in:
parent
cab46ea229
commit
7df2cbba1e
|
@ -61,10 +61,6 @@ class ParentModel(models.Model):
|
||||||
|
|
||||||
def init_parent_link(self):
|
def init_parent_link(self):
|
||||||
link = []
|
link = []
|
||||||
try:
|
|
||||||
p = self.parent
|
|
||||||
except Exception:
|
|
||||||
self.parent = None
|
|
||||||
if self.parent is not None:
|
if self.parent is not None:
|
||||||
if self.parent == self:
|
if self.parent == self:
|
||||||
raise Exception(f'{self.__class__.__name__}-{self.id}-存在循环引用')
|
raise Exception(f'{self.__class__.__name__}-{self.id}-存在循环引用')
|
||||||
|
@ -81,21 +77,18 @@ class ParentModel(models.Model):
|
||||||
raise Exception(f'{self.__class__.__name__}-{self.id}-最多支持四级')
|
raise Exception(f'{self.__class__.__name__}-{self.id}-最多支持四级')
|
||||||
return link
|
return link
|
||||||
|
|
||||||
def handle_parent(self, is_create:bool):
|
def handle_parent(self):
|
||||||
if hasattr(self, "parent_link"):
|
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.parent_link = self.init_parent_link()
|
||||||
|
self.save(update_fields=['parent_link'])
|
||||||
# 处理相关的所有父子关系
|
# 处理相关的所有父子关系
|
||||||
relats = self.__class__.objects.filter(parent_link__contains=[self.id])
|
relats = self.__class__.objects.filter(parent_link__contains=[self.id])
|
||||||
for relat in relats:
|
for relat in relats:
|
||||||
relat.parent_link = relat.init_parent_link()
|
relat.parent_link = relat.init_parent_link()
|
||||||
relat.save()
|
relat.save(update_fields=['parent_link'])
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -127,17 +120,28 @@ class BaseModel(models.Model):
|
||||||
is_create = True
|
is_create = True
|
||||||
self.id = idWorker.get_id()
|
self.id = idWorker.get_id()
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
# 处理父级
|
old_parent = None
|
||||||
self.handle_parent(is_create)
|
need_handle_parent = False
|
||||||
|
if hasattr(self, "parent"):
|
||||||
try:
|
try:
|
||||||
return super().save(*args, **kwargs)
|
old_parent = self.__class__.objects.get(id=self.id).parent
|
||||||
|
except Exception:
|
||||||
|
self.parent = None
|
||||||
|
need_handle_parent = True
|
||||||
|
if self.parent != old_parent:
|
||||||
|
need_handle_parent = True
|
||||||
|
try:
|
||||||
|
ins = super().save(*args, **kwargs)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
if is_create:
|
if is_create:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
self.id = idWorker.get_id()
|
self.id = idWorker.get_id()
|
||||||
return super().save(*args, **kwargs)
|
ins = super().save(*args, **kwargs)
|
||||||
raise e
|
raise e
|
||||||
|
# 处理父级
|
||||||
|
if need_handle_parent:
|
||||||
|
self.handle_parent()
|
||||||
|
return ins
|
||||||
|
|
||||||
|
|
||||||
class SoftModel(BaseModel):
|
class SoftModel(BaseModel):
|
||||||
|
|
Loading…
Reference in New Issue