这里的系统环境为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或者说框架,总有很多默认设置,当我们开发的时候一定要多测试多查阅文档才能更好的使用,不至于犯下一些惊人的错误。

                                                                 转自http://www.th7.cn/Program/Python/201410/299321.shtml