Django拆分app为多个小app

转自 杨仕航 的《Django拆分app为多个小app》

http://yshblog.com/blog/178


有些时候初学Django,经验不足会导致一种现象:app规划混乱。一个app混杂多个model,甚至这些model关联性不大。更严重的情况是整个Django项目只有1个app,该app混杂很多个models和各种views代码。

这种情况很不利于维护和后期功能拓展。如果让其他人接手你的代码,他们一定很头疼。


然而,整理混乱的代码不是一件简单的事情。假如你的app中models关联性比较强,可以拆分models.py文件。如下某个app的models.py文件代码:

 
 
  1. #coding:utf-8
  2. from django.db import models
  3.  
  4. class Blog(models.Model):
  5.     pass
  6.     
  7. class Tag(models.Model):
  8.     pass
  9.     
  10. class Author(models.Model):
  11.     pass

我们可以使用__init__.py方法拆分models.py。

首先,创建一个models文件夹。在models文件夹,创建一个空的__init__.py文件。这样models文件夹就成了一个包,可以import其中的内容。

接着,分别创建两个文件,如下所示:

扫描二维码关注公众号,回复: 1072254 查看本文章

models/blog.py

 
 
  1. #coding:utf-8
  2. from django.db import models
  3.  
  4. class Blog(models.Model):
  5.     pass
  6.     
  7. class Tag(models.Model):
  8.     pass

models/author.py

 
 
  1. #coding:utf-8
  2. from django.db import models
  3.  
  4. class Author(models.Model):
  5.     pass


将关联性更高的model放在一起完成拆分。但这样会导致Blog、Tag和Author等model引用路径发生变化。

原本引用的方式:

 
 
  1. # 假如app的名字叫做document
  2. from document.models import Blog, Tag, Author

现在这么处理之后,引用方式变成:

 
 
  1. from document.models.blog import Blog, Tag
  2. from document.models.author import Author

不用担心,我们可以修改__init__.py文件:

 
 
  1. from .blog import Blog, Tag
  2. from .author import Author

如此修改之后,原本的引用方式无需修改。因为import document.models的时候,就加载__init__.py文件。这是就引入相应models。


那,如果app更加混乱,需要强势拆分为多个app呢?

例如刚刚的models.py文件中3个models。我希望把其中的Author模块单独拆分为一个独立的app。

拆分app很麻烦,引用路径是小事,主要是数据库中的表名和字段能够一一对应。若不对应会导致数据库同步、迁移、读写错误。

这个需要使用model的meta类,写入app_label信息。


原本的结构如下:

 
 
  1. document
  2.     |- migrations (数据库信息文件夹)
  3.     |- __init__.py (空文件)
  4.     |- models.py
  5.         |- Blog
  6.         |- Tag
  7.         |- Author

我们需要先手动创建一个author文件夹,该文件夹和document同级。然后将Author模块从document中抽离并放到author中。如下结构:

 
 
  1. document
  2.     |- migrations (数据库信息文件夹)
  3.     |- __init__.py (空文件)
  4.     |- models.py
  5.         |- Blog
  6.         |- Tag
  7. author
  8.     |- __init__.py (空文件)
  9.     |- models.py
  10.         |- Author

注意,author文件夹中没有migrations文件夹。author的models.py文件代码如下:

 
 
  1. #coding:utf-8
  2. from django.db import models
  3.  
  4. class Author(models.Model):
  5.     pass
  6.     
  7.     class meta:
  8.         app_label = 'document'

这里标注app_label信息,指该model是属于document应用的。

我们还需在settings中注册该author应用。注册之后,你可以测试新增、修改和删除Author模块的字段。可发现相关的数据库操作信息会记录在document应用中。

当然,要记得修改其他文件对这个Author模块的应用。通常需要修改urls.py、views.py、migrations等等。

ps:用sublime text、notepad++、pychame等可以在指定文件夹对文件查找或替换。

猜你喜欢

转载自blog.csdn.net/yup1212/article/details/80352810