Django创建应用、ORM的进阶使用及模型类数据库迁移1

简介: Django创建应用、ORM的进阶使用及模型类数据库迁移1

1 Django项目创建第一个应用

Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为 App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。

一个 App 就是一个 Python 包,通常一个 App 可以包含模型、视图、模板和 URL 配置文件,可以被应用到多个 Django 项目中,因为它们的本质就是可被重用的 Python 软件包。

1.1 创建应用

Django 的设计目标是让开发者关注应用的功能逻辑的实现。

所以,创建应用的过程是非常简单的,利用 manage.py 提供的 startapp 命令就可以创建一个APP。

具体命令如下所示:

# 语法
# python manage.py startapp 应用名
python manage.py startapp index

startapp 同样也属于 manage.py 的子命令,用来创建 Django 的应用。

执行这个命令不会在命令行看到任何输出,但是可以在 manage.py 的同级目录下看到多出了一个 index 目录:

我们对这些文件做逐一的解释:

admin.py 用于将 Model 定义的数据表注册到管理后台,是 Django Admin 应用的配置文件

apps.py 用于应用程序本身的属性配置文件

models.py 用于定义应用中所需要的数据表

tests.py 文件用于编写当前应用程序的单元测试

views.py 用来定义视图处理函数的文件

一级目录下的 __init__.py 文件标识 index 应用是一个 Python 包

migrations 目录用于存储数据库迁移时生成的文件,该目录下的 __init__.py 文件标识 migrations 是一个 Python 包

这就是 index 应用涉及到的所有文件,当然在实际的开发工作中,该应用目录下的文件也不是一成不变的,开发者根据自己的需要会相应的增加文件或者子目录,比如 urls.py 文件或者存储静态文件的 static 目录等。所以大家千万不要认为 Django 框架自动生成的目录,无需我们做其他操作或者更改,这是使用 Django 的一个误区。

1.2 应用的添加

应用创建完成后,我们还需要在 settings.py 配置文件中对其进行添加。

我们已经对 INSTALLED_APPS 做了介绍,把我们创建的应用添加到这个列表,如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
]

用如上方式添加完成后,就可以让 index 应用的和整个项目融为一体了。

接下来,就可以正式进入开发应用阶段了,通过实现一些小的功能点,让我们更加全面的了解 Django 框架。

2 Django ORM进阶应用

ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。这种程序技术的底层主要是通过映射机制实现的,有兴趣的可以自己研究一下!


Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如 PostgreSQL、MySQL、Oracle、Sqlite3 等。

2.1 Django中定义数据表

那么在 Django 中如何使用 ORM 模块来定义一张数据表呢?

在定义数据表之前,我们应该首先理解什么是模型类。

模型类

其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类

通过上述介绍,我们可以这样理解:Django 中模型类就相当于 ORM 模块。

定义数据表

现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下:

class UserInfo(models.Model):
    name = models.CharFiled(max_length=100)
    password = models.CharFiled(max_length=100)

通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析:

第 1 行,使用 from django.db import models 导入 models 模块

第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类

第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。

2.2 ORM定义项目数据表

下面我们用 ORM 定义 index 应用所需的数据表,首选找到 index 应用下的 models.py 文件。

在文件里添加如下代码:

from django.db import models
# Create your models here.
# 创建book表
class Book(models.Model):
    title = models.CharField(max_length=30, unique=True, verbose_name='书名')
    public = models.CharField(max_length=50, verbose_name='出版社')
    price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='定价')
    retail_price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='零售价', default="30")
    def __str__(self):
        return "title:%s pub:%s price:%s" % (self.title, self.public, self.price)
# 创建作者表
class Author(models.Model):  
    name = models.CharField(max_length=30, verbose_name='姓名')
    email = models.EmailField(verbose_name='邮箱')
    def __str__(self):
        return '作者:%s' % self.name
# 创建用户信息表
class UserInfo(models.Model):  
    username = models.CharField(max_length=24, verbose_name='用户注册')
    password = models.CharField(max_length=24, verbose_name='密码')

通过上述代码,我们定义了一个名叫 Book 的数据表。

数据表由以下字段构成书名(title)、出版社(public)、价格(price)、零售价(retail_price),而且对每个字段都做添加了相应的字段属性以及字段选项。

2.3 Filed的通用字段选项

Model 中添加的字段都是 Field 类型的实例,不同的 Field 类型可能会支持不同的字段选项,但是也有很多字段选项是通用的,即可以用在任何一种 Field 类型中。这里介绍一些常用且重要的通用字段选项,它们都有对应的默认值,这些字段选项都是可选的,理解这些有助于更好地使用它们。

blank

默认值是 False,设置为 True 时,字段可以为空。设置为 False 时,字段是必须填写的。如果是字符型字段 CharField 和 TextField,它们是用空字符串来存储空值的。

unique

默认值是 False,它是一个数据库级别的选项,规定该字段在表中必须是唯一的。

null

默认为 False,如果此选项为 False 建议加入 default 选项来设置默认值。如果设置为 True,表示该列值允许为空。日期型、时间型以及数字型字段不接受空字符串。所以当设置 IntegerField,DateTimeField 型字段可以为空时,需要将 blank 与 null 均设为 True 才可以。

db_index

默认值是 False,如果设置为 True,Django 则会为该字段创建数据库索引,如果该字段经常作为查询的条件,那么就需要设置 db_index 选项,从而加快数据的检索速度。

db_column

这个选项用于设置数据库表字段的名称。如果没有指定,Django 默认使用 Model 中字段的名字。

default

用于给字段设置默认值,该选项可以设置为一个值或者是可以调用对象,但不能是可变对象,不同字段类型默认值也不同,比如 BooleanFiled 布尔类型 default 值为Ture 或者 False。主要的使用场景是当一个字段的值被用户省略时,后台服务器自动为该字段的设置默认值。

primary_key

默认值是 False,如果设置为 True,表示该字段为主键,在 Django 中 默认 id 为主键,也就是说即使你的数据表中没有创建 id 字段,Django 也会自动为你创建 id 字段并将其设置为主键。如果你在表中设置了其他字段为主键的时,那么 Django 将取消为 id 字段设置主键。

choices

这个选项用于给字段设置可以选择的值。它是一个可迭代对象,即列表或者元组,其中每一个元素都是一个二元组(a,b)的形式,a 是用来选择的对象,b 是对 a 的描述信息。比如我们对某个人性别定义数据表如下所示:

# 创建表
class UserInfo(models.Model):
    # 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:
    choices = (
        (male, '男性'),
        (female, '女性'),
    )
    gender = models.CharField(max_length=2,choices = choices,default='male')

verbose_name
设置此字段在 admin 后台管理系统界面上的显示名称,如果没有设置这个字段,Django 将会直接展示字段名并且将字段中的下划线转变为空格。

目录
相关文章
|
4天前
|
中间件 Python
中间件应用Django Middleware(Python)
中间件应用Django Middleware(Python)
30 6
|
14天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 3
|
17天前
|
Python
使用Django时,如何设计模型关系(一对一、一对多、多对多)?
Django支持三种模型关联:ForeignKey(一对多),OneToOneField(一对一)和ManyToManyField(多对多)。ForeignKey示例:`Article`有一个指向`Author`的外键。OneToOneField示例:`UserProfile`与`User`一对一关联。ManyToManyField示例:`Student`和`Course`之间多对多关系。这些关联字段便于反向查询,如`article.author`获取作者,`author.article_set.all()`获取作者所有文章。
16 1
|
17天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
18 0
|
22天前
|
安全 前端开发 中间件
Python面试题:Django Web框架基础与进阶
【4月更文挑战第17天】本文详细梳理了Django面试中常考的基础和进阶问题,包括MTV架构、ORM、数据库迁移、视图模板、中间件、信号、表单验证、用户认证授权等,并指出易错点及规避策略。提供代码示例展示模型和视图的实现,助力开发者在面试中脱颖而出。
41 12
|
25天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
25天前
|
存储 数据库 数据安全/隐私保护
基于Django的Python应用——学习笔记
基于Django的Python应用——学习笔记
|
25天前
|
API 数据库 数据安全/隐私保护
基于Django的python小应用——投票
基于Django的python小应用——投票
|
26天前
|
消息中间件 监控 数据库
Django的异步任务处理:提升应用响应速度与性能
【4月更文挑战第15天】Django通过集成Celery实现异步任务处理,提升Web应用性能和响应速度。异步处理用于耗时操作如数据库操作、邮件发送。基本步骤包括安装配置Celery、创建任务、在视图中调用任务并启动worker。应用场景包括发送通知、处理复杂逻辑和数据导入导出。注意任务原子性、优先级设置和任务执行监控。
|
26天前
|
开发者 Python
Django的信号机制:实现应用间的通信与响应
【4月更文挑战第15天】Django信号机制实现跨组件通信,基于订阅/发布模式,允许在事件(如模型保存、删除)发生时触发自定义函数。内置信号如`pre_save`、`post_save`,也可自定义信号。使用包括定义信号、连接处理器和触发信号。常用于模型操作监听、第三方应用集成和跨应用通信。注意避免滥用和保证处理器健壮性。信号机制提升代码可维护性和扩展性。