zoukankan      html  css  js  c++  java
  • [Django]orm中的外键级联删除

    这里的系统环境为django1.6   os为win7

    今天有个需求说的是加入一个地区表,然后用外键和几个很重要的实体表来做关联(地区表作为其它表的外键),写完地区的删除操作的时候,測试了下代码,功能正常。但是眼睛移动到控制台输出的时候傻了

    connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s)
    connexesql ->DELETE FROM `ad_ad` WHERE `ad_ad`.`area_id` IN (%s, %s, %s)
    connexesql ->DELETE FROM `mngm_area` WHERE `id` IN (%s, %s, %s)

    我这删除地区的时候居然把他关联的实体先删除了!。!

      这个地区仅仅是个附属属性。删除它的时候居然把更重要的实体都删除。这但是严重的问题啊。

    于是查询了下django orm中models中关于每一个field定义的档, https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey 。

    然后把字段定义改动成例如以下:

    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

    当地区area删除的时候把其它表关联到此字段设置为null。这样就仅仅是把area的记录删除了。

    django中外键小常识:
    * 外键关联的是一个对象,自己主动生成的外键名称会在关联的对象的名称后面加上个 "_id" 来作为字段名称
    * 默认情况下。外键会自己主动创建索引,会自己主动做级联删除。 默认的外键是字段是那张 表的主键

    models.SET_NULL这里还有其它几个选项:

    * SET_NULL 当外键的字段被删除的时候设置为null前提是指定了 null=True

    CASCADE  默认的选项,当外键关联的字段删除的时候。全部其它表级联删除

    SET_DEFAULT 设置一个默认值,当关联的记录删除的时候恢复成默认值

    *DO_NOTHING  django不做不论什么事情。数据库返回什么就报什么

    *  SET()¶ 还能够set一个函数,当关联记录删除的时候触发得到一个值


    对于orm或者说框架。总有非常多默认设置,当我们开发的时候一定要多測试多查阅文档才干更好的使用,不至于犯下一些惊人的错误。


    本文出自 orangleliu笔记本 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/40268495

  • 相关阅读:
    SqlServer该如何合适的索引
    SqlServer该如何合适的索引
    SQLServer跨库查询分布式查询
    SQLServer跨库查询分布式查询
    sqlserver 字符串能不能执行
    WPF添加类库并引用
    StringUtils类常用方法
    如何理解.NET开发中的x86/x64/AnyCPU
    JS获取url参数
    MySQL CONCAT函数:字符串拼接
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7232622.html
Copyright © 2011-2022 走看看