django models class 不识别问题解决方案
1. 事情起因
今天在写代码的时候,在django 的models目录中新增了一个pkg.py文件,里面定义了一个class, 在执行 makemigrations 的时候,发现这张表始终无法被识别,去网上找了找资料,没有找到这方面的问题的答案。。。
2. 排查经过
- 尝试把这个class放到models目录中的其他文件中,可以识别到这张表,由此怀疑可能是我新加的文件名称的原因,遂把pkg换成其他名字后,发现还是无法识别,尝试失败。。。
- 本着搞明白为什么会出现这种问题的心理,尝试去读makemigrations的源码,发现里面有个apps对象,保存着所有django app的信息,apps对象中有一个app_config对象,里面放的是AppConfig实例字典,后来读AppConfig源码时发现models_module和models对象嫌疑比较大,通过调试得知models_module对象只是存放了APP的models模块对象,但是models对象始终找不到是从哪里初始化的
- 接着扫描Apps对象的源码,发现了一个可疑的方法,get_registered_model,怀疑class的识别和这个方法应该有关系。在django源码里面全局搜索哪里调用了这个方法,发现了猫腻。这个方法在django源码里面只有在models.base.ModelBase类里面出现过,并且是在__new__方法里面调用。ModelBase类是models.Model的metaclass,于是想明白了整个过程。
- models里面的class都是继承自models.Model,在把这个类装载到内存中的时候,就会触发ModelBase中的new方法,也就是会自动把我们定义的class注册到AppConfig对象中,现在是没有注册进去,则说明我们定义的class没有被加载到内存中,在看源码的过程中发现AppConfig实例化的时候,会初始化models_module,这个操作会将APP中的models目录import到内存中,于是找到了解决办法,在我们的APP的models目录中的
__init__.py文件中添加一行from . import pkg,在初始化models_module的时候,导入了models目录的同时,会去执行__init__.py,而执行import的时候,会执行pkg.py文件,也就是把class加载到内存中,实现注册了。
3. 总结
前面的逻辑很绕,我也看了两个小时才把关系大致屡清楚,结论就是如果models目录中定义的py文件中的class类无法在makemigrations的时候被识别到,解决办法就是在models目录的__init__.py文件中import这个文件,就能识别到这个class类。
总的来说这次看源码大致的解决了面临的问题,但是至今无法找到为什么只有我新加的pkg.py文件未加载到内存中,被识别到并注册的原因。。。django的源码太复杂太绕了。
写这篇文章的目的是为了帮助那些采坑的童鞋们再踩到这个坑的时候,能在网上搜到这篇文章,解决你的问题,并对自己解决这个问题做一个记录,希望能够帮助到你。
django models class 不识别问题解决方案的更多相关文章
- Django models 操作高级补充
Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra
- Django models Form model_form 关系及区别
Django models Form model_form
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- django models数据类型
Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...
- django models 类型整理 version:1.8.3
django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- Django models中关于blank与null的补充说明
Django models中关于blank与null的补充说明 建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), ...
- Django Models的数据类型汇总
https://blog.csdn.net/devil_2009/article/details/41735611 Django Models的数据类型 汇总 AutoField IntegerFie ...
- Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
随机推荐
- SDOI2012 Round1 day2 拯救小云公主(dis)解题报告
#include<cstdio> #include<cmath> #include<iostream> using namespace std; typedef l ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- javax.servlet.ServletException: Could not resolve view with name‘ XXXX’in servlet with name 'spring'的解决方案-----SKY
出现的异常如下: javax.servlet.ServletException: Could not resolve view with name '{"msg":"成功 ...
- web.xml配置中的log4jRefreshInterval
采用spring框架的项目如何使用log4j在spring中使用log4j,有些方便的地方, 1.动态的改变记录级别和策略,即修改log4j.properties,不需要重启web应用,这需要在web ...
- 九度OJ 1203:IP地址 (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3038 解决:1496 题目描述: 输入一个ip地址串,判断是否合法. 输入: 输入的第一行包括一个整数n(1<=n<=500) ...
- Python小练习(持续更新....)
最近一直在学习python,这些小练习有些是书上的,有些是别人博客上的! # 1.题目1# 给一个字符串,统计其中的数字.字母和其他类型字符的个数:# 比如输入“124mid-=”,输出:数字=3,字 ...
- linux shell脚本: 自动监控网站状态并发送提醒邮件
1.创建监控脚本:$ vi /alidata/shell/webcheck.sh #!/bin/sh weblist="/alidata/shell/weblist.txt" my ...
- 给MDI窗体加背景,解释MakeObjectInstance和CallWindowProc的用法
工程含有1个MDI主窗口和2个子窗口.唯一需要注意的是,每个窗体都有ClientHandle,但只有当自己是MDI主窗体的情况下才有值,否则等于0. unit Unit1; interface use ...
- Symfony 使用KnpTimeBundle
使用time_diff时出现:diff.ago.hour; 解决:1:引入"knplabs/knp-time-bundle": "^1.7",https://g ...
- shell if判断-n
test测试命令 test命令用于检查某个条件是否成立,它可以进行数值.字符串和文件三个方面的测试,其测试符和相应的功能分别如下: (1)数值测试: -eq:等于则为真 -ne:不等于则 ...