ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django ORM定义实现链表结构

2022-08-15 19:33:01  阅读:200  来源: 互联网

标签:None self django 链表 next ORM save 节点 stage


需求场景

各种链表使用场景, 如单串, 双端链表等

需求描述

实现阶段间串联的可前进后退的关系模型

逻辑分析

节点间串联. 主要需要控制的是前节点和后节点的顺序关系

以及插入或删除节点时的一些操作

代码实现

"""
Stage
"""

from django.db import models


class Stage(models.Model):
    """
    Stage Model
    """

    name = models.CharField("阶段名称", help_text="阶段名称 string", max_length=64)
    remark = models.CharField(
        "备注", help_text="备注", max_length=255, null=True, blank=True
    )
    pre_stage = models.ForeignKey(
        "self",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        help_text="前一阶段",
        verbose_name="前一阶段",
        db_constraint=False,
        related_name="stage_stage_pre_stage",
    )
    next_stage = models.ForeignKey(
        "self",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        help_text="后一阶段",
        verbose_name="后一阶段",
        db_constraint=False,
        related_name="stage_stage_next_stage",
    )

    def __str__(self):
        return self.name

    def save(self,
             force_insert=False,
             force_update=False,
             using=None,
             update_fields=None,
             just_save=False):
        if just_save:
            return super().save()
        """
        1  =====> 1 -> 2      (2 在 1 后面追加)
        3  =====> 2 -> 3      (2 在 3 前面追加)
        1 -> 3  =====> 1 -> 2 -> 3    (2 在 1 和 3 中间追加)
        
        当前节点添加 
            存在前节点, 更新前节点的后节点为当前节点
            存在后节点, 更新后节点的前节点为当前节点
        """
        if self.pre_stage or self.next_stage:
            super().save()
            if self.pre_stage:
                self.pre_stage.next_stage = self
                self.pre_stage.save(just_save=True)
            if self.next_stage:
                self.next_stage.pre_stage = self
                self.next_stage.save(just_save=True)
        else:
            super().save()

    def delete(self, using=None, keep_parents=False, just_delete=False):
        if just_delete:
            return super().delete()
        """
        1 -> 2 -> 3  ====> 1 -> 3
        1 -> 2 -> None  ====> 1 -> None
        None -> 2 -> 
        3  ====> None -> 3
        None -> 2 -> None ====> None
        
        当前节点删除
            存在前节点: 更新前节点的后节点为 None
            存在后节点: 更新后节点的前节点为 None
            前后都存在节点: 前节点和后节点相连(前节点的后节点为后节点, 后节点的前节点为前节点) 
        """
        super().delete()
        # 1 -> 2 -> 3  ====> 1 -> 3
        if self.pre_stage and self.next_stage:
            self.pre_stage.next_stage = self.next_stage
            self.pre_stage.save(just_save=True)
            self.next_stage.pre_stage = self.pre_stage
            self.next_stage.save(just_save=True)
        # 1 -> 2 -> None  ====> 1 -> None
        elif self.pre_stage and not self.next_stage:
            self.pre_stage.next_stage = None
            self.pre_stage.save(just_save=True)
        # None -> 2 -> 3  ====> None -> 3
        elif not self.pre_stage and self.next_stage:
            self.next_stage.pre_stage = None
            self.next_stage.save(just_save=True)
        # None -> 2 -> None ====> None
        else:
            pass

    class Meta:
        verbose_name_plural = "阶段"

 

 

 

标签:None,self,django,链表,next,ORM,save,节点,stage
来源: https://www.cnblogs.com/shijieli/p/16589382.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有