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

  • 相关阅读:
    java+opencv实现图像灰度化
    java实现高斯平滑
    hdu 3415 单调队列
    POJ 3368 Frequent values 线段树区间合并
    UVA 11795 Mega Man's Mission 状态DP
    UVA 11552 Fewest Flops DP
    UVA 10534 Wavio Sequence DP LIS
    UVA 1424 uvalive 4256 Salesmen 简单DP
    UVA 1099 uvalive 4794 Sharing Chocolate 状态DP
    UVA 1169uvalive 3983 Robotruck 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7232622.html
Copyright © 2011-2022 走看看