转自 杨仕航 的《Django拆分app为多个小app》
有些时候初学Django,经验不足会导致一种现象:app规划混乱。一个app混杂多个model,甚至这些model关联性不大。更严重的情况是整个Django项目只有1个app,该app混杂很多个models和各种views代码。
这种情况很不利于维护和后期功能拓展。如果让其他人接手你的代码,他们一定很头疼。
然而,整理混乱的代码不是一件简单的事情。假如你的app中models关联性比较强,可以拆分models.py文件。如下某个app的models.py文件代码:
- #coding:utf-8
- from django.db import models
- class Blog(models.Model):
- pass
- class Tag(models.Model):
- pass
- class Author(models.Model):
- pass
我们可以使用__init__.py方法拆分models.py。
首先,创建一个models文件夹。在models文件夹,创建一个空的__init__.py文件。这样models文件夹就成了一个包,可以import其中的内容。
接着,分别创建两个文件,如下所示:
models/blog.py
- #coding:utf-8
- from django.db import models
- class Blog(models.Model):
- pass
- class Tag(models.Model):
- pass
models/author.py
- #coding:utf-8
- from django.db import models
- class Author(models.Model):
- pass
将关联性更高的model放在一起完成拆分。但这样会导致Blog、Tag和Author等model引用路径发生变化。
原本引用的方式:
- # 假如app的名字叫做document
- from document.models import Blog, Tag, Author
现在这么处理之后,引用方式变成:
- from document.models.blog import Blog, Tag
- from document.models.author import Author
不用担心,我们可以修改__init__.py文件:
- from .blog import Blog, Tag
- from .author import Author
如此修改之后,原本的引用方式无需修改。因为import document.models的时候,就加载__init__.py文件。这是就引入相应models。
那,如果app更加混乱,需要强势拆分为多个app呢?
例如刚刚的models.py文件中3个models。我希望把其中的Author模块单独拆分为一个独立的app。
拆分app很麻烦,引用路径是小事,主要是数据库中的表名和字段能够一一对应。若不对应会导致数据库同步、迁移、读写错误。
这个需要使用model的meta类,写入app_label信息。
原本的结构如下:
- document
- |- migrations (数据库信息文件夹)
- |- __init__.py (空文件)
- |- models.py
- |- Blog
- |- Tag
- |- Author
我们需要先手动创建一个author文件夹,该文件夹和document同级。然后将Author模块从document中抽离并放到author中。如下结构:
- document
- |- migrations (数据库信息文件夹)
- |- __init__.py (空文件)
- |- models.py
- |- Blog
- |- Tag
- author
- |- __init__.py (空文件)
- |- models.py
- |- Author
注意,author文件夹中没有migrations文件夹。author的models.py文件代码如下:
- #coding:utf-8
- from django.db import models
- class Author(models.Model):
- pass
- class meta:
- app_label = 'document'
这里标注app_label信息,指该model是属于document应用的。
我们还需在settings中注册该author应用。注册之后,你可以测试新增、修改和删除Author模块的字段。可发现相关的数据库操作信息会记录在document应用中。
当然,要记得修改其他文件对这个Author模块的应用。通常需要修改urls.py、views.py、migrations等等。
ps:用sublime text、notepad++、pychame等可以在指定文件夹对文件查找或替换。