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

news2024/11/25 11:00:23

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 将会直接展示字段名并且将字段中的下划线转变为空格。

3 index应用数据库迁移

上面我们创建好了 index 应用所需的数据表,下一步就是执行数据库的迁移,之后让我们再来看一下又有什么新的变化发生呢?数据库迁移的两个命令分步骤执行,如下所示:

python manage.py makemigrations
python manage.py migrate

执行完毕后会在命令行得到如下输出:

若迁移过程中出现报错提示,首先检查您的 models.py 文件是否正确书写,除此之外,也可能由于 Django 与 MySQL 版本问题导致报错。

从上述输出结果可以看出,我们对 index 应用进行了数据库迁移工作。

并且在数据库中创建了三张表,分别是 Author、Book、UserInfo。

而且在 index 应用下的 migrations 目录下生还成了一个 0001_initial.py 的文件:

这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件。

4 魔术方法__str__

__str__方法是 Python 中的 "魔术” 方法,它是为 print 这样的打印函数设计的,它属于 python 的 object 基类的一个方法,也就是说 python 所有的类都有该方法,当然 Django 的 modle 类也有。如果没有这个方法定义,打印对象会显示对象的内存地址,但是这样的显示方式不够友好,且不利于调试,而用 __str__ 方法后,可以在 print 时得到易于人阅读的信息,在如下所示:

# 直接print打印
class TestClass:
    def __init__(self):
        self.name = 'testcase'
        
t = TestClass() #实例化对象
print(t)        # 结果显示:<__main__.TestClass object at 0x8f5c27b42367>
# __str__方法
class TestClass:
    def __init__(self):
        self.name = '小明'
    def __str__(self):
        return self.name
t = TestClass() #实例化对象
print(t)      
  # 结果显示:小明
 

本节内容为 index 应用创建了数据表,并且一步步带领大家实现了如何自定义模型类以及完成了数据表的迁移的,而且对产生的迁移文件也做了介绍,接下来我们将学习 Django 的后台管理系统,看看它是如何配合 ORM 使用的。

5 Django Admin数据表可视化

Django 的后台管理系统是非常出色的,新建项目以后,Django 就为我们设置好了后台管理系统的各种功能。

5.1 后台管理系统的重要性

我们知道,Web 站点上某些内容的改动是后台管理员来完成的,如果管理员直接用 Shell 或者 SQL 语句来修改,不仅麻烦,而且容易操作失误,从而导致数据不一致的结果。假如是一个不懂编程的人呢?应该怎么去操作呢?上述问题,说明了构建一个后台管理系统的重要性,通过后台管理系统为管理员提供一种便捷有效的操作方式。

后台管理系统主要是对数据表的存储做专门的管理,例如针对微博或者论坛类的站点,管理员需要删除不合规的文章,或者公司内部需要发布新的话题等,这些都是通过数据表的管理实现的。单一功能的后台系统比较容易构建,但是如果功能增多情况下,就需要对多个数据表做管理,这就增加了开发人员的重复性工作。Django 提供的后台管理系统很好的解决了这个问题。

5.2 创建超级用户

通过命令创建超级管理员账户,命令如下所示:

python manage.py createsuperuser --username=admin --email=admin@163.com

这里将用户名设置为 admin,邮箱设置为 admin@163.com,也可以根据自己的需要去修改。如果在 createsuperuser 后面不加任何内容,Django 会提示用户输入用户名和邮箱。当前命令执行后,需要重复输入两次密码,密码可以根据自己的需要设置,但是密码不能过于简单。

如下图所示,表示创建成功:

注意:输入密码的时候,不会显示。

注意:超级用户拥有所有权限,方便技术人员或非技术人员以可视化的形式对应用数据记录实现增删改查的操作。

启动 BookStore 项目,然后在浏览器地址栏输入 127.0.0.1:8000/admin 访问,输入刚刚创建的超级用户名以及密码进行登录。如下所示登录成功:

5.3 将Model注册到管理后台

  • 在admin.py文件中声明

    那么如何把自定义的数据表 Model 注册到管理后台呢?

    也就是说要把 Model 显示在 Admin 后台管理系统界面,需要做哪些操作呢?

    当我们使用 startapp 命令创建 index 应用的时候会自动创建 admin.py 文件,想要把自定义的 Model 注册到管理后台,就需要在 admin.py 文件中进行声明,添加如下代码:

    from django.contrib import admin #Django自动在admin.py文件中导入
    from index.models import Book, Author,UserInfo #这个需要我们自己导入相应的模型类(数据表)
    admin.site.register([Book,Author,UserInfo])

    通过上述代码,我们就完成了将 Model 注册到后台管理系统的操作,其实实现的过程也非常的简单,首先通过 django.contrib 的标准库引入 admin 应用,然后把 index 应用下我们自定义的三张数据表引入,最后我们调用 admin.site.register() 方法实现模型类的注册。多个模型类一起注册我们使用列表的形式来统一注册,如果是单一的模型类注册,我们可以使用以下方式即可:

    admin.site.register(Book)

    至此我们就完成了数据表在 Admin后台管理系统的可视化操作,我们再次使用ctrl+F5刷新后台管理系统的显示页面,可以得到如下结果:

  • 提示:图中每张数据表的名字都加上了s,这是Django自动设定的,我们可以通过相应的修改将其去掉,在后续章节我们将介绍。

    虽然看似页面简单并且没有太多的附加功能,但是对于简单的增删改操作而言已经足够使用了。我们打开其中的 UserInfos 数据表来查看,如下所示:

  • 点击增加 USERI INFO 按钮会得到如下页面,在此页面我们可以进行数据的添加、编辑、保存操作:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023高教社杯国赛ABCDE题免费思路预定(MathClub网站汇聚市面的所有资源,注册即送)

目录 引言A题&#xff1a;[题目名称]概述参考思路参考资源 B题&#xff1a;[题目名称]概述参考思路参考资源 结论 作者&#xff1a;MathClub 日期&#xff1a;2023年9月6日 引言 2023年全国大学生数学建模竞赛&#xff08;高教社杯&#xff09;即将来临&#xff0c;对于众多数…

ChatGPT:深度学习和机器学习的知识桥梁(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

nodejs+vue+elementui精品课程网站设计

前端技术&#xff1a;nodejsvueelementui基于nodejs语言、vue.js框架、B/S架构、Mysql数据库设计并实现了精品课程网站设计。系统主要包括首页、个人中心、用户管理、课程信息管理、课程分类管理、学习论坛、在线试题管理、试题管理、系统管理、考试管理等功能模块。 本文首先介…

tf和pytorch每轮epoch显示输出的auc是如何计算的

tf和pytorch每轮epoch显示输出的auc是如何计算的&#xff1f; tf的计算 近似 ROC 或 PR 曲线的 AUC&#xff08;曲线下面积&#xff09;。 tf1 通过计算真阳性&#xff0c;假阳性&#xff0c;假阴性&#xff0c;真阴性值的计算策略。 tensorflow AUC & streaming_auc_我…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

PHP教学质量评估系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP教学质量评估系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码 https://download.csdn.net/download/qq_41221322/88301983 论文 https://down…

【简单几何】CF Edu11 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 和蓝桥杯国赛有道题类似&#xff0c;都是用中点来确定图形防止精度缺失 应该算是典 Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e3 10; constexpr int M 1e6 1…

stm32(GD32,apm32),开优化后需要特别注意的地方

提到优化就不得不提及 volatile 使用场景 1&#xff1a;中断服务程序中修改的供其它程序检测的变量&#xff0c;需要加volatile&#xff1b; : 2&#xff1a;多任务环境下各任务间共享的标志&#xff0c;应该加volatile&#xff1b; 3&#xff1a;并行设备的硬件寄存器&#x…

干货|数学建模必考的四大模型

数学建模国赛即将开始&#xff0c;小编总结近五年的数学建模ABC题题型&#xff0c;并根据题型总结建模常用的四大模型&#xff0c;如下&#xff1a; A题 一般A题偏物理方面&#xff0c;专业性更强&#xff0c;偏难&#xff0c;新手不建议选择A题&#xff0c;原因在于可能看不…

【ccf-csp题解】第1次csp认证-第四题-无线网络-题解

题目描述 思路讲解 可以把题目抽象为&#xff1a;从第1个点到第2个点&#xff0c;经过特殊点的数量不超过k的单源最短路径&#xff08;其中每条边的权重均为1&#xff09; 可以使用bfs解决这个问题&#xff0c;但是dist[][]数组和队列中放置的pair<int,int>元素不再是单…

【大魔王送书第二期】搞懂大模型的智能基因,RLHF系统设计关键问答

RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff0c;人类反馈强化学习&#xff09;虽是热门概念&#xff0c;并非包治百病的万用仙丹。本问答探讨RLHF的适用范围、优缺点和可能遇到的问题&#xff0c;供RLHF系统设计者参考。 目录 RLHF是什么&#xff1f;…

京东API 接入说明(1688商品详情,关键字搜索商品等)

API地址:https://o0b.cn/anzexi 调用示例&#xff1a;https://api-gw.onebound.cn/jd/item_get/?keytest_api_key& &num_iid10335871600&&langzh-CN&secret 参数说明 通用参数说明 url说明 https://api-gw.onebound.cn/平台/API类型/ 平台&#xff1a;淘…

java修改版本不生效的解决办法

1、jdk安装使用了.exe文件直接运行安装&#xff0c;这个不用配置环境变量&#xff0c;惠子动生成运行的文件&#xff0c; 2、现象&#xff0c; 修改环境变量不生效 3、解决办法 dos命令页——>输入where java 将查到的文件按照路径删掉&#xff08;不要删除安装的文件&#…

docker笔记9:Docker-compose容器编排

目录 1.是什么&#xff1f; 2. 能干嘛&#xff1f; 3.去哪下&#xff1f; 4.安装步骤 ​编辑 5.卸载步骤 6.Compose核心概念 6.1概念 6.2 Compose常用命令 7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 …

[LeetCode周赛复盘] 第 112场双周赛20230903

[LeetCode周赛复盘] 第 112场双周赛20230903 一、本周周赛总结2839. 判断通过操作能否让字符串相等 I1. 题目描述2. 思路分析3. 代码实现 2840. 判断通过操作能否让字符串相等 II1. 题目描述2. 思路分析3. 代码实现 2841. 几乎唯一子数组的最大和1. 题目描述2. 思路分析3. 代码…

阻止 NTLM后无法登录远程桌面的原因

阻止 NTLM(NT LAN Manager) 攻击设置二 之前郑州景安的服务器被攻击&#xff0c;没过几天阿里云的也被攻击&#xff0c;且都是 NTLM 攻击。 Operating System: Windows Server 2008(R2) Enterprise Service Pack 1 64bit 一、winr 输入 gpedit.msc 二、依次进入&#xff1a;…

leetcode:268. 丢失的数字(python3解法)

难度&#xff1a;简单 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数字&#xff0c;所以所有…

高效复用:RecyclerView内部嵌套横向列表时的优化技巧

背景 假设要实现下面的效果图&#xff1a; 如图所示&#xff0c;首先这是一个多样式的滑动列表&#xff08;截图里只列举了其中的3 种样式&#xff09;&#xff0c;整体外部使用 RecyclerView 来实现没什么疑问。那么截图第3个ItemView 中箭头指向的横向标签列表如何实现呢&am…

网络编程套接字 | 预备知识

在之后的文章中我们将来讲解网络编程中的相关知识点&#xff0c;再本文中我们首先来讲解一下网络编程中的预备知识&#xff1a; 预备知识 源IP地址和目的IP地址 在IP数据包中有两个IP地址分别是源IP地址和目的IP地址&#xff0c;此时这里就会出现一个问题就是&#xff1a;如…

Spring MVC 之MVC 体系结构、什么是SpringMVC

Spring MVC简介 MVC 体系结构三层架构MVC设计模式 Spring MVC 是什么&#xff1f;扩展知识Spring模块Data Access/Integration&#xff08;数据访问/集成&#xff09;Web&#xff08;网络层&#xff09;AOP&#xff08;面向切面&#xff09;Messaging&#xff08;消息传送&…