Django2.0 models中的on_delete参数

一、外键、OneToOne字段等on_delete为必须参数

?

  • 如下ForeignKey字段源码,to、on_delete为必须参数
    to:关联的表
    on_delete:当该表中的某条数据删除后,关联外键的操作
    related_name:反查参数,设置后可以在被关联表中通过该字段反查外键所在表,默认:set_表名
    to_field:默认主键,因为mysql只支持主键作为外键,就算你没显式的创建主键,Django会给你自动创建,
    如果你是DB-first,且没创建主键:数据库默认使用隐藏字段:DB_ROW_ID作为主键
class ForeignKey(ForeignObject):
    """
    Provide a many-to-one relation by adding a column to the local model
    to hold the remote value.

    By default ForeignKey will target the pk of the remote model but this
    behavior can be changed by using the ``to_field`` argument.
    """
    ...

    def __init__(self, to, on_delete, related_name=None, related_query_name=None,
                 limit_choices_to=None, parent_link=False, to_field=None,
                 db_constraint=True, **kwargs):

?

二、on_delete参数常用设置方式

?

  • 级联删除:models.CASCADE
    当关联表中的数据删除时,该外键也删除
  • 置空:models.SET_NULL
    当关联表中的数据删除时,该外键置空,当然,你的这个外键字段得允许为空,null=True
  • 设置默认值:models.SET_DEFAULT
    删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
#级联删除情况
class UserToken(models):                             #级联删除,用户删除,它也删除
    user = models.OneToOneField(to='User', on_delete=models.CASCADE, to_field='id')
    token = models.CharField(max_length=128, null=True)

#置空情况
class Server(models.Model):

    server_type_choice = (
        (1, "WEB"),
        (2, "存储"),
        (3, "缓存")
    )

    server_type = models.IntegerField(choices=server_type_choice)
    hostname = models.CharField(max_length=32)
    port = models.IntegerField()
    business_unit = models.ForeignKey("BusinessUnit", on_delete= models.SET_NULL, null=True)

#设置默认值
    user = models.ForeignKey("UserInfo", on_delete= models.SET_DEFAULT, default=0)
  • 两个不常用的
  • PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
  • SET(): 自定义一个值,该值当然只能是对应的实体了

原文地址:https://www.cnblogs.com/shiqi17/p/9807026.html

时间: 2024-08-30 18:26:52

Django2.0 models中的on_delete参数的相关文章

django2.0 models.py创建外键时报错

现象: 在创建外键的时候遇到报错:TypeError: __init__() missing 1 required positional argument: 'on_delete' 解决: 查询一番后发现Django2.0版本创建外键时需要在后面加上on_delete.   原文地址:https://www.cnblogs.com/yang842718540/p/8386059.html

django2.0 官方中文文档地址

django2.0 官方开始发布中文文档了,之前还想着一直翻译完成所有有必要的内容,想着可以省事一些了,打开以后看了一下,发现官方的中文文档还没翻译完成, 现在(2018-7-10)最新章节是是  编写你的第一个 Django 补丁(https://docs.djangoproject.com/zh-hans/2.0/intro/contributing/) django 2.0 官方中文文档地址: https://docs.djangoproject.com/zh-hans/2.0/ 原文地址

Models中字段的参数

(1)null 如果为True,Django 将用NULL 来在数据库中存储空值. 默认值是 False. (1)blank 如果为True,该字段允许不填.默认为False. 要注意,这与 null 不同.null纯粹是数据库范畴的,而 blank 是数据验证范畴的. 如果一个字段的blank=True,表单的验证将允许该字段是空值.如果字段的blank=False,该字段就是必填的. (2)default 字段的默认值.可以是一个值或者可调用对象.如果可调用 ,每有新对象被创建它都会被调用.

Django2.0在models创建数据表时报错

Django2.0在models创建数据表时报错TypeError: __init__() missing 1 required positional argument: 'on_delete' 如下创建了两个表,Tag 表以 Contact 表为外部键,此时可以看到pycharm控制台报错 123456789101112131415 class (models.Model): name = models.CharField(max_length=200) age = models.Intege

Django2.0中URL的路由机制

Django2.0中URL的路由机制 路由是关联url及其处理函数关系的过程.Django的url路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称. Django的路由都写在urls.py文件中的urlpatterns列表中,由path()或re_path()作为元素组成. Django的URL路由流程: 1 Django查找全局urlpatterns变量(urls.py) 2 按照先后顺序,对URL逐一匹配urlpatterns每个元素 3 找到第一个匹配

Django2.0.3如何实现页面静态化

我们在开发新闻系统的时候,为了提高系统的响应速度,通常我们会将常用的数据实现静态化,我们如何将新闻内容实现静态化呢?环境:Python3.5 + Django2.0.3 引入模块: from django.shortcuts import renderfrom .models import Category,Tag,Item,Ad,Articleimport osfrom django.conf import settingsimport codecsfrom django.template.l

django2.0 路由规则

Django2.0中URL的路由机制 路由是关联url及其处理函数关系的过程.Django的url路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称. Django的路由都写在urls.py文件中的urlpatterns列表中,由path()或re_path()作为元素组成. Django的URL路由流程: 1 Django查找全局urlpatterns变量(urls.py) 2 按照先后顺序,对URL逐一匹配urlpatterns每个元素 3 找到第一个匹配

Django2.0在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

1.产生原因:在创建外键后,执行 python manage.py makemigrations报错,具体代码为: from django.db import models class Classes(models.Model): title = models.CharField(max_length=32) m = models.ManyToManyField("Teachers") class Teachers(models.Model): name = models.CharFi

Django2.0中的on_delete字段取值含义

在Django的2.0版本中,外键字段 ForeignKey 和一对一字段 OneToOneField 都必须设置 on_delete 属性,否则会有以下报错: TypeError: __init__() missing 1 required positional argument: 'on_delete' 对于on_delete字段的取值含义如下: on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为 on_delete=models.CASCADE, #