You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django执行makemigrations时模型触发TypeError错误求助

解决Django中ForeignKey缺少on_delete参数的错误

你遇到的这个报错是Django 2.0及以后版本的常见问题——从Django 2.0开始,ForeignKey字段必须显式指定on_delete参数,用来定义当关联的父模型(这里是Pizza)实例被删除时,子模型(Topping)实例该如何处理。

错误原因

你的Topping模型中定义外键的代码:

pizza = models.ForeignKey(Pizza)

缺少了必填的on_delete参数,这在新版Django中是不允许的。

解决方案

根据披萨和配料的逻辑,最合理的设置是on_delete=models.CASCADE——当某个披萨被删除时,它对应的所有配料也一起被删除。修改后的Topping模型代码如下:

from django.db import models

# Create your models here.
class Pizza(models.Model):
    """List of pizzas"""
    name = models.CharField(max_length=50)
    
    def __str__(self):
        """Return a string representation of the model"""
        return self.name

class Topping(models.Model):
    """Toppings"""
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)  # 添加必填的on_delete参数
    name = models.CharField(max_length=50)
    
    def __str__(self):
        """Return a string representation of the model"""
        return self.name

其他可选的on_delete参数(按需选择)

  • models.PROTECT: 阻止删除关联的Pizza实例,如果尝试删除会抛出错误,适合不想意外删除父对象的场景
  • models.SET_NULL: 将Topping的pizza字段设为null,但需要同时设置null=True,比如models.ForeignKey(Pizza, on_delete=models.SET_NULL, null=True)
  • models.SET_DEFAULT: 将字段设为默认值,需要提前设置default参数

修改完成后,重新运行以下命令即可正常生成迁移文件:

python manage.py makemigrations
python manage.py migrate

内容的提问来源于stack exchange,提问作者Kidsnd274

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:42:51