Django拆分app为多个小app

  • 发布时间:2017年6月20日 01:42
  • 作者:杨仕航
  • 分类标签: Django
  • 阅读(14997)
  • 评论(3)

有些时候初学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等可以在指定文件夹对文件查找或替换。

上一篇:Django模板设置全局变量(默认变量)

下一篇:ui-router使用ocLazyLoad加载js

评论列表

mygoldwings

mygoldwings

🍠🍈🍉🍋🍌🍍🍨⛽🚧🚀✈ 测试 不能传图片(^-^)V

2019-03-30 11:13 回复

  • mygoldwings

    11

    2019-03-30 11:14 回复

  • mygoldwings 回复 mygoldwings

    你好棒

    2019-03-30 11:14 回复

新的评论

清空