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)

回答:

在迁移模型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编辑器也会提示。建议先把环境配置成和书中一样的版本。

以上是 django迁移模型entry 提示 on delete 的全部内容, 来源链接: utcz.com/a/164990.html

回到顶部