【Python】django报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'解决办法

在Django2.0以后,定义外键时必须包含'on_delete'参数以避免数据不一致问题。报错信息显示在Article模型中缺少该参数。解决方案是添加'on_delete'选项,例如:author = models.ForeignKey('Author', on_delete=models.CASCADE)。使用CASCADE、PROTECT、SET_NULL、SET_DEFAULT或SET()中的一个来定义外键删除行为。通常使用CASCADE进行级联删除。" 104236506,8581167,Idea快捷键与Springboot热部署教程,"['前端开发', 'IDE工具', 'Java', 'Spring框架', '开发效率']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误代码:

from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Author(models.Model):
    name = models.CharField(max_length=50)
    qq = models.CharField(max_length=10)
    addr = models.TextField()
    email = models.EmailField()

    def __str__(self):
        return self.name

@python_2_unicode_compatible
class Article(models.Model):
    title = models.CharField(max_length=50)
    author = models.ForeignKey(Author)
    content = models.TextField()
    score = models.IntegerField()
    tags = models.ManyToManyField('Tag')

报错信息:

D:\PythonWorkstation\django\django_station\queryset>python manage.py makemigrations
Traceback (most recent call last):
部分省略.....
    class Article(models.Model):
  File "D:\PythonWorkstation\django\django_station\queryset\blog\models.py", line 20, in Article
    author = models.ForeignKey('Author')
TypeError: __init__() missing 1 required positional argument: 'on_delete'

原因解读:

在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,否则就会报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'

错误代码块:

author = models.ForeignKey(Author)

更正后:

author = models.ForeignKey(Author,on_delete=models.CASCADE)

再次执行更正后的代码即正常

D:\PythonWorkstation\django\django_station\queryset>python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Article
    - Create model Author
    - Create model Tag
    - Add field author to article
    - Add field tags to article

对on_delete参数的说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个参数:
CASCADE:此值设置,是级联删除;
PROTECT:此值设置,是会报完整性错误;
SET_NULL:此值设置,会把外键设置为null,前提是允许为null;
SET_DEFAULT:此值设置,会把设置为外键的默认值;
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值