创建第二个app

1. 创建命令

在已经创建好初始app1的情况下,使用命令创建第二个app2:

python manage.py startapp app2

2. 整理文件结构

将创建好的app2放入到app文件夹中便于管理:

—Top
   ├─.idea
   │  └─inspectionProfiles
   ├─apps
   │  └─app2
   │      ├─migrations
   │      ├─__init__.py
   │      ├─admin.py
   │      ├─apps.py
   │      ├─urls.py
   │      └─......
   ├─app1
   │  ├─__init__.py
   │  ├─asgi.py
   │  ├─urls.py
   │  ├─settings.py
   │  └─......
   ├─manage.py
   ├─db.sqlite3
   └─templates
       └─index.html
       
# 这里的app1为主app, apps文件夹下的所有其他app为次app
# 主app里有settings.py, 次app里没有

3. settings.py

在主app的settings.py中加入(或修改为):

import sys
# 存放其他app的文件夹,名字叫apps
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
    # 注册app2
    'app2',
]

4. app2的urls.py

在app2中新建urls.py:

from django.conf.urls import url
from django.urls import path, include
from app2 import views

urlpatterns = [
    url(r'^$', views.hello),
]

5. app1的urls.py

在app1中的urls.py中加入:

# 自行对照views.py修改
urlpatterns = [
    url(r'^$', views.hello),
    path('app2/', include("apps.app2.urls")),
    path('index/', views.show),
    path('test/', views.test),
]

关联不同数据库

1. 数据库路由

在主app(app1)中创建一个新文件 database_router.py

#!/usr/bin/env python
# coding:utf8
from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING  # 在setting中定义的路由表


class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):

        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):

        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_syncdb(self, db, model):

        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

2. settings.py

在settings.py中写入:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        # app1对应的数据库文件路径
        'NAME': os.path.join(BASE_DIR, 'app1.db'),
    },
    'app2db': {
        'ENGINE': 'django.db.backends.sqlite3',
        # app2对应的数据库文件路径
        'NAME': os.path.join(BASE_DIR, 'app2.db'),
    }
}

DATABASE_ROUTERS = ['app1.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    # 关联数据库:
    # 'app_name':'database_name',
    'app1': 'default',
    'app2': 'app2db',
}

3.调用数据库

在业务逻辑中直接调用数据库

# App2是app2中的一个model类名,自行编写models.py完成数据库表的映射
res = App2.objects.using('app2db').all().values('id')

更多推荐