Django生成数据库及添加用户报错解决方案

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

原因:

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

例如:

  owner=models.ForeignKey(UserProfile)--->报错

  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就可以了。

在使用Django添加用户时出现报错:

django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fai
 ls (`cms`.`app01_book_author`, CONSTRAINT `app01_book_author_book_id_df0ca405_fk_app01_book_id` FOREIG
 N KEY (`book_id`) REFERENCES `app01_book` (`id`))')
 [31/Mar/2019 21:20:45] "GET /addbook/ HTTP/1.1" 500 216210

解决办法,需要在setting.py文件的databases中取消外键检查:

1 DATABASES = {

 DATABASES = {
   'default': {
     'ENGINE': 'django.db.backends.mysql',
     'NAME': 'cms', # 你的数据库名称
     'USER': 'root', # 你的数据库用户名
     'PASSWORD': '123456', # 你的数据库密码
     'HOST': '', # 你的数据库主机,留空默认为localhost
     'PORT': '3306', # 你的数据库端口
     'OPTIONS': {
       "init_command": "SET foreign_key_checks = 0;", # 取消外键检查
     }
   }
 }

问题解决!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • django 解决model中类写不到数据库中,数据库无此字段的问题

    如果你遇到了这个错误–MySQL Strict Mode is not set for database connection 'default' 还有这种错误,models中的代码 为什么会出现这种错误呢?有两种可能,一种settings少了options,一中是你的models文件中加了逗号 第一种可能 settings中需要添加以下字段 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxs

  • Django ForeignKey与数据库的FOREIGN KEY约束详解

    数据库在高并发的场景下使用外键约束会有锁问题并且使用外键会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用外键. 那么不使用外键约束的情况下使用 Django ORM 如何实现关联查询两个表呢?这曾是困扰我很久的一个问题,今天终于找到了答案,写出来分享一下. Django 的 ForeignKey 和数据库的 FOREIGN KEY 并不一样.Django 的 ForeignKey 是一种逻辑上的两个表的关联关系,可以指定是否使用数据库的 FOREIGN KEY 约束. 在开头提到的场景

  • Python的Django框架实现数据库查询(不返回QuerySet的方法)

    一.创建模型类: # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models class Course(models.Model): """课程表""" name = models.CharField(verbose_name='课程名称', max_length=255) description = models.Tex

  • django 数据库返回queryset实现封装为字典

    默认情况下,Python DB API会返回不带字段的结果,这意味着你得到的是一个列表,而不是一个字典.花费一点性能代价之后,你可以返回一个字典形式的结果,像这样: def dictfetchall(cursor): "Returns all rows from a cursor as a dict" desc = cursor.description return [ dict(zip([col[0] for col in desc], row)) for row in cursor

  • django 数据库 get_or_create函数返回值是tuple的问题

    get_or_create函数比较好用. 如果查询到就返回,如果没查询到就向数据库加入新的对象. e.g. size = Size.objects.get_or_create(sizeName=size_text) 注意:返回的是tuple,:(对象, 是否是创建的) e.g. (size, created) 补充知识:Django update_or_create 注意事项 需求: model 修改数据库数据,数据存在则更新,不存在则保存 update_or_create 用法: update

  • 使用Django清空数据库并重新生成

    删除数据库内所有的表 删除项目的migrations文件夹中的所有 文件,除了__init__.py 文件 运行命令 python manage.py makemigrations python manage.py migrate 补充知识:python django数据创建,更新,删除 记得关注我 Django框架已经帮我们做了很多东西了,今天就看看数据库创建,更新,删除的操作语句吧. 以上这篇使用Django清空数据库并重新生成就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家

  • django 连接数据库出现1045错误的解决方式

    根据菜鸟教程Django教程学习,运行"python manage.py migrate" 报错,出现 django.db.utils.OperationalError: (1045, "Access denied for user '账号'@'localhost' (using password: YES)") 错误. 这种错误指的是连接数据库时账号密码错误. 1.只需要修改setting.py文件里的DATABASES即可:(按照图中注释修改) DATABASE

  • Django生成数据库及添加用户报错解决方案

    Django生成数据库表时报错 __init__() missing 1 required positional argument: 'on_delete' 原因: 在django2.0后,定义外键和一对一关系的时候需要加上on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错 例如: owner=models.ForeignKey(UserProfile)--->报错 owner=models.ForeignKey(UserProfile,on_delete=models.

  • 解决django model修改添加字段报错的问题

    关于django models中添加字段的一个小节,记录下 django的models中已经写好了字段,可是后面我又想在添加一些字段,于是就在models中添加了字段 ,发现报错了 报错的类型: 字段重复了 不知道的列 : 最后解决的方法 : 到models的目录下打开文件 ,直接把所需的字段添加到第一次编译的文件中 , 重新执行数据库的迁移 ,如果依然有报错,提示有未知的列 ,就查看数据库 ,那个列缺失,就把列给添加上 添加未知的列 至此,重新执行迁移 ,妥妥的成功了 ! 以上这篇解决djan

  • Django对数据库进行添加与更新的例子

    先把models.py摆这儿 #models.py class UserProfile(AbstractUser): ''' 继承Django的AbstractUser 并向里面添加两条数据内容怀疑 ''' gender = models.CharField(max_length=6,choices=(('male','男'),('female','女')),default='female',verbose_name='性别') memo = models.TextField(null=True

  • Django执行python manage.py makemigrations报错的解决方案分享

    目录 1.环境 2. (No changes detected)及解决 2.1 问题情景 2.2 原因分析 2.3 修改方式 3. (2026, ‘SSL connection error:unknown error number‘) 及解决 3.1 问题情景 3.2 原因分析 3.3 解决方案 总结 1.环境 mysql 8.0 Django 3.2 pycharm 2021.11 2. (No changes detected)及解决 2.1 问题情景 # 迁移数据库 python mana

  • Pyinstaller打包.py生成.exe的方法和报错总结

    Pyinstaller 打包.py生成.exe的方法和报错总结 简介 有时候自己写了个python脚本觉得挺好用想要分享给小伙伴,但是每次都要帮他们的电脑装个python环境.虽然说装一下也快,但是相对来说效率还是不高,要是能将python的**.py文件转化为.exe**,那么世界将变得更美好.这篇文章我将简单的介绍如何使用Pyinstaller来打包我们的python脚本. 安装 Pyinstaller pyinstaller的官网为:http://www.pyinstaller.org/

  • 解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]

    Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_uniqu

  • springboot配置mysql数据库spring.datasource.url报错的解决

    目录 springboot配置mysql数据库spring.datasource.url报错 springboot下datasource连接配置 基本设置 datasource JPA jooq h2 JTA springboot配置mysql数据库spring.datasource.url报错 spring.datasource.url=jdbc:mysql://abc:3306/abcd?useUnicode=true&characterEncoding=utf8 很常规地配置了这个mysq

  • 使用MyBatisPlus自动生成代码后tomcat运行报错的问题及解决方法

    自动生成的代码 报错 解决办法:把自动xml文件中自动生成的二级缓存注释掉 总结 到此这篇关于使用MyBatisPlus自动生成代码后tomcat运行报错的问题及解决方法的文章就介绍到这了,更多相关MyBatisPlus自动生成代码tomcat运行报错内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 教你解决往mysql数据库中存入汉字报错的方法

    一.遇到的问题 在向数据库中存入汉字时遇到这样的问题: Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9F\xAF\xE5\x8D\x97' for column 'user_name' at row 1 二.分析问题 这是由于数据库设计有问题导致的,当初创建数据库的时候直接选择的默认,没有修改为utf-8,后来尝试手动修改还是不行. 尝试把数据库和表的默认字段改为utf8,但是还是不能存汉字. 三.真正的问题 真正的问

  • Mysql数据库delete操作没报错却删除不了数据的解决

    1.在操作页面执行删除操作,但没有删除成功,删除过程无报错(以下为删除操作的控制台日志) 2.在数据库执行删除操作 表数据 执行删除语句删除staffId为3的数据 结果却没有删除成功 3.原因 staffId为3的数据的flag为Null,虽然delete from staff where staffId=3 and flag != 1语句中的flag != 1说明了删除除1以外的数据,但却没有删除flag为Null的数据 4.解决办法 把staffId为3的flag置为0 再次执行delet

随机推荐