当前位置: 知识网 > 建站问题

Django生成数据库表时报(__init__() missing 1 required positional argument: 'on_delete')

知识网2021年10月24日 16:13cnblog

code:

1 #encoding=utf-8

2 from django.db import models

3 # Create your models here.

4 class BookInfo(models.Model): #创建书本信息类,继承models.Model

5 booktitle=models.CharField(max_length=20)

6 bookdata=models.DateField()

7 class HeroInfo(models.Model): #创建英雄信息类

8 heroname=models.CharField(max_length=10)

9 herosex=models.BooleanField()

10 herocontent=models.CharField(max_length=50)

11 herobook=models.ForeignKey('BookInfo') #引用外键,即BookInfo对象

RX:

django生成数据表时报错

解决办法:

将第十一行的代码改为:

herobook=models.ForeignKey('BookInfo',on_delete=models.CASCADE)

即在外键值的后面加上 on_delete=models.CASCADE

原因:

在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

举例说明:

user=models.OneToOneField(User)

owner=models.ForeignKey(UserProfile)

需要改成:

user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值

owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值

参数说明:

on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

一般情况下使用CASCADE就可以了。

很赞哦!(46)

发表高见 (请对您的言行负责)
2021年10月24日 16:26,回答 by_淘气宝宝:
老的教程没有这一个值,所以都会报错,幸好看到了这个文章,很感谢
2021年10月24日 16:14,回答 by_淘气宝宝:
很详细,非常棒,CASCADE:此值设置,是级联删除。

©芃睿知识网 版权所有 2012-2023 shsongjiang.com

备案号:赣ICP备2022001527号-1