首页 > 其他分享 >django ORM定义实现链表结构

django ORM定义实现链表结构

时间:2022-08-15 19:23:23浏览次数:75  
标签: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
From: https://www.cnblogs.com/shijieli/p/16589382.html

相关文章

  • django路由层
    1、django请求生命周期流程图2、路由层2.1路由匹配"""url方法第一个参数是正则表达式,只要第一个参数正则表达式能够匹配到内容那么就会立刻停止往下匹配.直接执行对......
  • 初识django与ORM
    一、django简介Python三大主流web框架django、flask、tornadodjango特点:大而全自带的功能特别特别特别的多类似于航空母舰不足之处:有时候过于笨重flask特点:小......
  • Codility CountConformingBitmasks
    CodilityCountConformingBitmasks100%scoresdefsolution(A,B,C):#writeyourcodeinPython3.6bit_list=[0]*32bit_A=[0]*32bit_B=......
  • 14 Django_forms组件之ChoiceField类型
    如果想要灵活应用ChoiceField,那么请看如下:classTransactionRecord(ActiveBaseModel):"""交易记录"""charge_type_class_mapping={1:"success",......
  • 13 Django-url跳转携带条件
    在生成URL时,需要读取当前URL中的参数并构造URL。例如:当前URLhttp://127.0.0.1:8000/customer/list/?keyword=xinchen&page=8构造编辑页面URLhttp://127.0.0.1:800......
  • VUE+Django前后端分离-第二部分
    四、前端layout及页面跳转1、在src/components目录下创建HeaderAsideMainHeader.vue:<template><header><div><h1style="margin-to......
  • VUE+Django前后端分离-第一部分
    一、创建django项目1、创建django项目在指定目录下,用django-adminstartprojectdjango_vue创建Django项目2、在django项目下创建应用 2.1在django_vue目录下通过命......
  • 12 Django 力度控制到按钮级别
    易理解的按钮控制:customer.html{%extends'layout.html'%}{%loadstatic%}{%loadpermission%}{%blockcontent%}<divstyle="margin-bottom:5px"c......
  • 1075 链表元素分类——25分
    给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0,K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变......
  • tf.randm_normal
    tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)tf.random_normal()函数用于从“服从指定正态分布的序列”中随机取出指定个数......