1. 事情起因

今天在写代码的时候,在django 的models目录中新增了一个pkg.py文件,里面定义了一个class, 在执行 makemigrations 的时候,发现这张表始终无法被识别,去网上找了找资料,没有找到这方面的问题的答案。。。

2. 排查经过

  1. 尝试把这个class放到models目录中的其他文件中,可以识别到这张表,由此怀疑可能是我新加的文件名称的原因,遂把pkg换成其他名字后,发现还是无法识别,尝试失败。。。
  2. 本着搞明白为什么会出现这种问题的心理,尝试去读makemigrations的源码,发现里面有个apps对象,保存着所有django app的信息,apps对象中有一个app_config对象,里面放的是AppConfig实例字典,后来读AppConfig源码时发现models_module和models对象嫌疑比较大,通过调试得知models_module对象只是存放了APP的models模块对象,但是models对象始终找不到是从哪里初始化的
  3. 接着扫描Apps对象的源码,发现了一个可疑的方法,get_registered_model,怀疑class的识别和这个方法应该有关系。在django源码里面全局搜索哪里调用了这个方法,发现了猫腻。这个方法在django源码里面只有在models.base.ModelBase类里面出现过,并且是在__new__方法里面调用。ModelBase类是models.Model的metaclass,于是想明白了整个过程。
  4. 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 不识别问题解决方案的更多相关文章

  1. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  2. Django models Form model_form 关系及区别

    Django models Form model_form

  3. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  4. django models数据类型

    Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...

  5. django models 类型整理 version:1.8.3

    django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...

  6. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  7. Django models中关于blank与null的补充说明

    Django models中关于blank与null的补充说明 建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), ...

  8. Django Models的数据类型汇总

    https://blog.csdn.net/devil_2009/article/details/41735611 Django Models的数据类型 汇总 AutoField IntegerFie ...

  9. Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案

    Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案

随机推荐

  1. hdu1695(容斥 or 莫比乌斯反演)

    刚开始看题,想了一会想到了一种容斥的做法.复杂度O( n(3/2) )但是因为题目上说有3000组测试数据,然后吓尿.完全不敢写. 然后想别的方法. 唉,最近精神有点问题,昨天从打完bc开始想到1点多 ...

  2. Educational Codeforces Round 1 (C) (atan2 + long double | 大数)

    这题只能呵呵了. 东搞西搞,折腾快一天,最后用了一个800多行的代码AC了. 好好的题目你卡这种精度干啥. 还有要卡您就多卡点行不,为什么long double 又可以过... 废了N长时间写个了不管 ...

  3. Dire Wolf(区间DP)

    Dire Wolf Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Total ...

  4. 九度OJ 1345:XXX定律之画X (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:361 解决:157 题目描述: 给你一个n,然后让你输出F(n) 规则是这样的,F(n)的输出结果是: F(n-1)     F(n-1) ...

  5. 6.2-SingletonBeanRegistry-DefaultSingletonBeanRegistry

    SingletonBeanRegistry package org.springframework.beans.factory.config; public interface SingletonBe ...

  6. 20179209《Linux内核原理与分析》安全类实验答疑

    实验一 题目 Nmap 配合 Metasploit 进行端口扫描 问题 Nmap怎么配合Metasploit进行端口扫描? 回答 这里的Nmap配合Metasploit进行端口扫描是指在Metaspl ...

  7. python基础-第五篇-5.2递归

    又是一个阳光明媚的日子,小白看着刚刚从东边升起的太阳,感觉太阳爷爷也在向她打招呼,小白就不经的微笑起来!心想:今天又会学到什么有趣的东西呢?有些小期待,也有些小激动! 小刘来得比小白还早,两辆相视而笑 ...

  8. 只需两步删除 node_modules

    peng@PENG-PC /E/_My_File_____/home/learn/web_qianduan/mithril-demo/demo2/mithril -demo $ npm install ...

  9. Call method 的使用

    SAP学习日志---Call method 的使用 以及常见错误 转载▼   可以通过以下方法 call method 1. 进入全局类中 找到方法,拖到程序中 2. 使用pattern 中的 AAB ...

  10. 学习使用MarkDown

    文本采用CuteMarkEd软件编写后复制到博客园(这个软件可以实时观看html效果,也可以打印pdf,挺好使.测试比sublime装插件要简单方便) MarkDown格式文本 名称 ======== ...