Django: __init__() missing 1 required positional argument: 'on_delete'报错解决方案

Posted 老_张

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django: __init__() missing 1 required positional argument: 'on_delete'报错解决方案相关的知识,希望对你有一定的参考价值。

最近在使用Python的Django框架开发web站点,通过models.py文件建表后,执行数据库迁移(命令行:mange.py makemigrations)时报错,下面是查看官方文档后找到的解决方案。

官方文档:Model field reference

 

报错内容:

1     class Guest(models.Model):
2   File "C:\Users\dell\guest\sign\models.py", line 18, in Guest
3     event = models.ForeignKey(Event)                     # 关联发布会
4 TypeError: __init__() missing 1 required positional argument: on_delete

 

 models.py文件:

 1 from django.db import models
 2 
 3 # Create your models here.
 4 # 发布会表
 5 class Event(models.Model):
 6     name = models.CharField(max_length=100)              # 发布会标题
 7     limit = models.IntegerField()                        # 参加人数
 8     status = models.BooleanField()                       # 状态
 9     address = models.CharField(max_length=200)           # 地址
10     start_time = models.DateTimeField(event time)      # 发布会时间
11     create_time = models.DateTimeField(auto_now=True)    # 创建时间(自动获取当前时间)
12 
13     def __str__(self):
14         return self.name
15 
16 # 嘉宾表
17 class Guest(models.Model):
18     event = models.ForeignKey(Event)                                 # 关联发布会
19     realname = models.CharField(max_length=64)                       # 姓名
20     phone = models.CharField(max_length=16)                          # 手机号
21     email = models.EmailField()                                      # 邮箱
22     sign = models.BooleanField()                                     # 签到状态
23 create_time = models.DateTimeField(auto_now=True)                    # 创建时间(自动获取当前时间)
24 
25 class Meta:
26     unique_together = ("event", "phone")
27 
28 def __str__(self):
29     return self.realname

 

解决方法:将报错提示的models文件第18行修改为下面的内容即可:

 event = models.ForeignKey(Event,on_delete=models.CASCADE,) 

 

报错原因:

 classForeignKey(to,on_delete,** options)  

多对一的关系,需要两个位置参数:模型相关的类和on_delete选项。(on_delete实际上并不需要,但是不提供它会给出弃用警告,这在Django 2.0中将是必需的,1.8及以前的版本不需要

要创建递归关系,即:与自身具有多对一关系的对象使用。 models.ForeignKey(self, on_delete=models.CASCADE) 

 

PS:Django的版本更新比较频繁,每次版本迭代都有些改动,有问题直接查官方文档或者Stack Overflow,基本都可以解决。

 

以上是关于Django: __init__() missing 1 required positional argument: 'on_delete'报错解决方案的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

Django __init__() 得到了一个意外的关键字参数“用户”

Django 2.1.3 错误:__init__() 采用 1 个位置参数,但给出了 2 个

为什么Django应用程序需要`manage.py`而不是使用`__init__py`?

简单的留言簿 django:__init__() 接受 1 个位置参数,但给出了 2 个

TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数