django所有应用放到一个apps目录配置和应用之外独立使用Model

本文介绍如何优化Django项目的目录结构,将应用集中管理,并讨论了不同开发环境下所需配置。此外,还介绍了如何在应用外使用模型及自定义模型公共字段的方法。

多应用统一目录管理

在实际Django项目开发中,创建工程之后比如demoproj,在工程目录下会存在一个同名的文件夹作为项目的入口(比如,公共配置、URL规则等)和一个manage.py管理文件。

默认创建应用的时候,会在 manage.py 同级目录下创建,随着开发,应用可能越来越多,这个时候建议把所有应用统一放到一个目录下管理,比如都放到apps目录下。

项目结构编程如下

| - demoproj
| - - demoproj
| - - manage.py
| - - apps
| - - - user(app)
| - - - cmdb(app)
| - - - ticket(app)
| - - - ops(app)
| - - - ...

目录结构调整之后,需要修改 settings.py 配置来适配结构

# demoproj/settings.py
import os
import sys

# 
BASE_DIR = Path(__file__).resolve().parent.parent
# 以下是新增
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

这个时候,从命令行模式使用角度来说,项目是没有任何问题的。

但是有几个特殊的地方还是需要注意下:

1、创建新的应用app的时候

cd apps
python ../manage.py startapp new_appname

或者在 manage.py 同级目录下创建之后,在手动移动到apps 下,建议前者

2、如果是使用命令行开发、或者 Sublime、Vscode 工具开发,到此就不需要额外配置什么

3、如果是使用 PyCharm 工具开发,需要把 apps 配置成 Source Root ,这由于该工具本身的特性决定的

配置的目的是: 让Pycharm工具本身知道应用的根 是从apps目录计算的,这样在apps目录下的各个应用中,依赖导入的时候,以应用本身开始就行

比如在 cmdb 应用的导入 user应用的User模型

# cmdb/models.py
from user.models import User

这样就不会有错误提示, 不然就会有 Unresolved reference 'user' 这样的错误提示。

具体如何配置可以参考网上教程。

应用之外使用Model

一般Django项目开发中,功能逻辑都是写到某个应用中去的,然后通过Django的URL进行方法。

但是在某些情况下会出现在应用之外使用某个应用中定义的模型来完成一些特性功能。

举个例子,在开发运维管理平台中,定了 CDN 资产模型完成了逻辑功能开发,在项目上线之前,需要做一次数据初始化,一般会开发一个工具脚本,从云厂商接口获取数据写入对应的数据库,数据写入会借助于对应的模型来实现。

该脚本工具肯定是独立在Django应用之外的。但是又要使用 Django 中定义的模型。比如下面结构中的 init_cdn.py

| - demoproj
| - - demoproj
| - - manage.py
| - - apps
| - - - cmdb(app)
| - - - ...
| - - scripts
| - - - init_cdn.py

这个时候就需要在脚本中做特殊配置

# scripts/init_cdn.py
import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demoproj.settings')
# 很关键的配置
django.setup()

from cmdb.models import CDN
# 其他常规功能逻辑

1、如上的配置需要写到该文件的最开始部分

2、切记需要 django.setup()

晚上很多教程说只要 os.environ.setdefault 这个配置项就行了,但是实际测试中这样是有问题,需要添加上下面一步

扩展1:自定义模型公共部分

一般在Django开发中,每个模型都会id字段、创建时间、更新时间。或者有时候都会有 是否删除和删除时间字段。

既然是每个模型都会有的,那么在每个模型中重复性的把这些字段定义一遍肯定是代码冗余和低效的表现。

高效的方式是把这些公共字段自定义到一个抽象模型中去,然后其他模型来依赖

1、定义功能抽象模型

# apps/baseModel.py
class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)
    deleted_time = models.DateTimeField(default=None, null=True, blank=True, verbose_name="删除时间")
    is_deleted = models.BooleanField(default=False)

    class Meta:
        abstract = True

2、应用模型中继承

# cmdb/models.py

from baseModel import BaseModel

class CDN(BaseModel):
    name = models.CharField(max_length=64, verbose_name="CDN域名")
    ... ...

扩展2: UUID作为模型主键

在定义Django模型的时候,继承了models.Model之后,一般不会显示的定义模型主键,默认会有一个id作为自增的主键

id = models.AutoField(primary_key=True)

有些情况下使用自增的ID主键又不合适,比如可以通过 id 的值推测出当前数据库中的数据总条目、甚至可以推断出相邻数据的主键等等

所有有时候会使用 UUID 作为主键 相对比较合适些。UUID 是一种全局唯一标识符,通常用32位的字符串来表现,类似 33d1f6b3-ffae-4ebe-9c88-a5becd71a0bc。

实现方式

# apps/baseModel.py

# 需要导入该python库
import uuid

class BaseModel(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
    ... ...

原文地址: http://www.colinspace.com/blog/post/27/

本课程是一个系列的django实战进阶开发教程,目标是带领大家快速上手实战,课程以最新版本django3.2为蓝本,深入django源码本身,通过内置的类视图来开发,即CBV模式开发,从最基础的类显示视图到类编辑视图再到混入视图,由浅入深,专注Django的高级知识,带你系统的玩转Django,无过多的依赖第三方库,进一步降低学习门槛,更加专注django框架本身!本课程将带你实现一个功能完备的商城系统,如:新闻管理、商品管理(包含多规格)、订单管理、购物车、快速下单、评论、地址、运费模板等常见的商城功能!除此之外,你还可以将本课程内容中涉及到的django类视图的高级用法作为参考资料,在以后的开发中用到的时候再翻阅。认真看完这个系列视频教程之后,您会深入理解django框架的高级知识以及开发流程,具备使用django上手开发实际项目的基本能力!本课程亮点一、少量的第三方依赖,降低学习门槛开发过程中依赖第三方库少,减少大家的进一步的学习理解成本,从而更加专注django框架本身!二、前端轻度结合vue.js,无需过多前端技能本项目将轻度结合vue.js以及fetch来完成一些异步请求,无需过多vue 知识,更贴合后端开发者,也更加靠近当下最热门的技术栈,为前后端分离项目开发打下坚实的基础!三、采用django本身序列化方法构造json,深入django框架本身深度使用Django本身的序列化器来序列化数据,构造一些异步操作的接口,通过这一深度使用对未来使用drf框架将打下坚实的基础,学习drf框架将变的非常容易。四、CBV模式开发,深入Django类视图本项目全部采用Django的类视图,深入学习类视图,不同的请求我们可以在类中使用不同的方法来处理,这样大大的提高了代码的可读性以及高度扩展性,更加便于二次开发!五、多规格产品功能,更符合实际需求网上千篇一律的教程都没有深入讲解多规格商品的实现思路,本专栏将手把手带你完成多规格功能,并且对JD及TB的两种多规格模式的利弊进行深入剖析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值