使用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
相关产品推荐
相关产品推荐

