django迁移模型entry 提示 on delete

根据图书《python编程从入门到实践》来操作,修改完models.py后,执行命令python manage.py makemigrations learning_logs,就报错,求大神指点。
图片描述

model.py 代码

from django.db import models
class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)

    def __str__ (self):
        """返回模型的字符串表示"""
        return self.text
    
class Entry(models.Model):
    """学到的有关某个主题的具体知识"""
    topic = models.ForeignKey(Topic)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add = True)

    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text[:50] + "..."

manage.py 代码如下

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "learning_log.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)
阅读 4.3k
4 个回答

在迁移模型Entry时,运行代码python manage.py makemigrations learning_logs,报错

TypeError: __init__() missing 1 required positional argument: 'on_delete'

    经官方文档解释:https://docs.djangoproject.com/e ... /fields/#foreignkey发现foreignkey需要增加一个参数on_delete,于是将topic = models.ForeignKey(Topic)  更改为

topic = models.ForeignKey('Topic', on_delete=models.CASCADE),成功运行。

两种可能

  • topic = models.ForeignKey(Topic)少了一个参数on_delete.不确定你使用的是django哪个版本。我怎么记得之前这个参数是可选的呢。。。

https://docs.djangoproject.co...

  • makemigrations的时候,和你app下面的migrations文件夹里面的文件相冲突。解决办法是删掉migrations文件夹里面除了__init__.py之外的所有文件。重新生成migrate文件。不过这个时候,你的数据库表结构一般也要清空,除非你能手动修改数据库中的表django_migrate.

因为你用的 django 版本是 2.x,这个版本对于外键已经强制需要声明 on_delete,低版本的不用,可以看一下 django 的升级日志

新手上路,请多包涵

Django2.0之后,on_delete是必须要写的。不然的话会报错,pycharm编辑器也会提示。建议先把环境配置成和书中一样的版本。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题