这个问题的原因显而易见,数据库中没有数据库表 onlyoffice_customuser,但是你却想要使用它。
排除因为 sqlite3 数据库放错位置的情况(路径问题),那就是真的没有这个表。
但我是执行数据库迁移命令报错的:
python manage.py makemigrations
还没开始就结束了?
我的原因:
我这里的问题在于,我写了个全局变量:
FILES = get_all_files()
这个函数调用了数据库。
def get_all_files():
files = list(FileModel.objects.all())
return files
因为 全局变量是顶格写的,所以在加载 *.py 文件时就会直接运行,导致数据库还没建立就先被查询了。
我的解决办法:不直接只用全局变量,改为通过函数获取全局变量。
把 FILES = get_all_files() 注释掉,改为:
FILES = None
def get_all_files():
global FILES
if not FILES:
FILES = list(FileModel.objects.all())
return FILES
只有在需要用 FILES 时才调用 get_FILES 函数,避免因为顶格赋值而被提早调用。
下面是我探索的过程,可不看。
我写了个类 Curstomuser
重新运行命令:
>python manage.py makemigrations
就报错了:
我以为是自己设计的类有问题,结果发现是因为我在其它 py 文件中进行了数据库查询。
而 Django 架构让我忽略了代码运行的前后关系。。。
先注释掉其它 py 文件中的调用:
再次运行即可。
这是一种原因,还有一次我删除了数据库,修改了models.py 里的model,再次运行也报类似的错:
打开数据库,发现里面空白一片,确实没有创建这个表,而且其它表也没创建:
我很迷啊。
解决:
在项目的根目录下有个缓存文件夹:pycache
这个文件夹里的内容,就是缓存。我们重复去编译的时候,肯定会受到缓存的影响。所以我删除了整个缓存文件夹,反正下次会自动再生成。
但是,不好意思,并没用。我把可以删除的都删除了,然并。
退一步,注释了新model的内容调用,包括models.py 文件中的新 model 定义,只保留老的内容,再运行命令总行了吧。
没有反转,还真行了。。。。
所以,估计还是调用顺序的问题。我删除刚生成的文件,重新来一遍测试一下。
没毛病,就是调用的问题:
所以,只要注释掉自定义的 model 被调用的地方,就能运行成功。我不理解为什么,但大受震撼。我猜测还是代码调用顺序问题。