Python Django 模型概述与应用

今天来为大家介绍 Django 框架的模型部分,模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。

Django 模型

Django 中模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,在创建模型前需要先配置好数据库。Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle等,Django 为这些数据库提供了统一的调用 API。我们可以根据自己业务需求选择不同的数据库。

数据库配置

Python 内置 SQLite,所以你无需安装额外东西来使用它,在 TestProject 项目目录下,打开 TestProject/settings.py 配置文件, 已经配置了 SQLite 作为默认数据库。当然如果在真实项目中,我们可以换一个更具扩展性的数据库,如Mysql等。具体配置操作如下:

# TestProject/settings.py# Database
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'pythontest','USER': 'root','PASSWORD': 'yu201541010','HOST': 'localhost','PORT': '3306',}
}

配置说明:

  • ENGINE:数据库驱动,可选('django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或 'django.db.backends.oracle')

  • NAME:数据库的名称(这里使用的SQLite对应的是一个数据库文件路径)

  • USER:数据库登陆用户名

  • PASSWORD:数据库登陆密码

  • HOST:数据库所在主机连接地址(可以是域名或IP地址)

  • PORT:数据库所在主机服务端口号

TestProject/__init__.py

import pymysqlpymysql.install_as_MySQLdb()

创建模型

还是以我们之前创建的投票应用为基础,在这个应用中创建两个模型--Question和Choice。

  • Question(问题)中包含提问的内容和发布的时间两个字段。

  • Choice(选项)中包含针对问题的选项以及已投票数,每个问题可以有多个选项。

下面我们将以上模型描述通过编辑 polls/models.py 文件定义出来。

# polls/models.pyfrom django.db import modelsclass Question(models.Model):    question_text = models.CharField(max_length=200)    pub_date = models.DateTimeField('发布日期')class Choice(models.Model):    question = models.ForeignKey(Question, on_delete=models.CASCADE)    choice_text = models.CharField(max_length=200)    votes = models.IntegerField(default=0)

这里有以下几点需要注意:

  1. 每个模型被定义为 django.db.models.Model 类的子类。

  2. 每个模型有一些类变量,它们都表示模型里的一个数据库字段。

  3. 每个字段都是 Field 类的实例,如 CharField 对应数据库中的字符串字段。

  4. 每个 Field 类实例变量的名字也是字段名,如 question_text,定义时需要遵循数据库字段规则。

  5. 实例变量的名字可以定义备注名,方便代码理解,如 pub_date = models.DateTimeField('发布日期')。

  6. 某些 Field 类实例定义时需要参数,还有一些可选参数,对应数据库表结构,如 CharField 类需要定义长度max_length。

  7. 使用 ForeignKey 可以定义表外键关联,如本例中用 ForeignKey 定义了每个 Choice 都要关联到一个 Question 对象上。

激活模型

通过配置上面 models.py 类中创建模型的代码,已经足够 Django 为我们创建数据库和相应表结构了,现在我们将 polls 应用安装到我们 TestProject 项目中。首先再次打开 TestProject/settings.py 配置文件,在配置类 INSTALLED_APPS 中添加 polls 应用的点式路径 'polls.apps.PollsConfig',配置完成如下所示:​​​​​​​

# TestProject/settings.pyINSTALLED_APPS = [    'polls.apps.PollsConfig',   #新增polls路径    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',]

因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 'polls.apps.PollsConfig'

保存配置并退出,然后运行 makemigrations 命令, Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移(迁移是 Django 对于模型定义即你的数据库结构的变化的储存形式)。​​​​​​​

$ python manage.py makemigrations pollsMigrations for 'polls':  polls/migrations/0001_initial.py    - Create model Question    - Create model Choice

执行成功后,就可以再执行 migrate 命令,将你在模型中定义的数据库修改同步到应用的数据库表结构上,执行结果如下:​​​​​​​

$ python manage.py migrateOperations to perform:  Apply all migrations: pollsRunning migrations:  Applying polls.0001_initial... OK

数据库迁移操作被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。

模型操作

对模型对象的操作,本质上就是数据库数据的操作。下面我们就通过对模型对象操作实现对数据库记录基本的CURD操作。

新增数据

编辑 TestProject 项目下polls/views.py 文件代码,通过访问URL 在 Question 模型对应表中添加数据。​​​​​​​

# polls/views.pyfrom django.shortcuts import render# Create your views here.from django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezonedef index(request):    return HttpResponse("你好,这是一个投票页面。")# 增加问题描述信息def add(request):    question = Question(question_text='双十一你在哪个平台剁手?',pub_date=timezone.now())    question.save();    return HttpResponse("新增投票成功!")

再编辑 polls/urls.py 文件代码,新增一条 add 的路由,代码如下:​​​​​​​

# polls/urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [    path('', views.index, name='index'),    path('add', views.add, name='add'),    #新增add路由]

保存后,通过 python manage.py runserver 127.0.0.1:8080 命令启动本地开发服务器,启动后在浏览器中输入URL地址 http://127.0.0.1:8080/polls/add ,会返回如下页面表示新增数据成功。

图片

接下来我们再刷新下页面,这样就会再增加一条数据,然后我们把这两条记录查出来。

查询数据

Django 提供了多种方式来查询出数据库记录,如查询上面 Question 模型对应全部数据,某个id的数据以及通过多条件过滤得到所需要的数据。依然编辑 TestProject项目下 polls/views.py 文件,增加查询对应代码:​​​​​​​

# polls/views.py# …… 省略部分代码def query(request):    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM question    questionList = Question.objects.all()    # 获取单个对象    response2 = Question.objects.get(id=1)    # 相当于SQL中的WHERE id=1,可设置条件过滤    response3 = Question.objects.filter(id=1)    #根据id字段排序    response5 = Question.objects.order_by("id")    res = ""    # 遍历所有对象    for q in questionList:        res += str(q.id) + "." + q.question_text + " <br />"    return HttpResponse("查询所有问题:<br />" + res)

再编辑 polls/urls.py 文件代码,新增一条 query 的路由,代码如下:

# polls/urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [    path('', views.index, name='index'),    path('add', views.add, name='add'),      path('query', views.query, name='query'),  #新增的query路由]

然后再浏览器中输入 URL http://127.0.0.1:8080/polls/query ,看到如下图所求请求结果:

图片

可以看到出现两条一样的记录,但是 id不同,不过这正符合我们的预期,下面我们将对第一条数据进行修改和删除。

修改数据和删除

修改和删除数据可以操作一条或多条记录,这取决于你的查询条件,再次编辑 TestProject 项目下 polls/views.py 文件,增加修改和删除对应代码:​​​​​​​

# polls/views.py# …… 省略部分代码#修改数据def update(request):    question1 = Question.objects.get(id=1)    question1.question_text = '天猫和京东你会选哪个?'    question1.save()    # 通过条件过滤的方式也可以更新一条或多条数据    # Question.objects.filter(id=1).update(question_text='天猫和京东你会选哪个?')    return HttpResponse("更新id=1:" + question1.question_text)#删除数据def delete(request):    question2 = Question.objects.get(id=2)    question2.delete()    # 通过条件过滤的方式也可以删除一条或多条数据    # Question.objects.filter(id=2).delete()    # 删除所有数据    # Question.objects.all().delete()    res3 = ''    questionList = Question.objects.all()    # 遍历所有对象    for q in questionList:        res3 += str(q.id) + "." + q.question_text + " <br />"    return HttpResponse("删除后查询:<br />" + res3)

再编辑 polls/urls.py 文件代码,新增一条 query 的路由,代码如下:​​​​​​​

# polls/urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [    path('', views.index, name='index'),    path('add', views.add, name='add'),      path('query', views.query, name='query'),     path('update', views.update, name='update'),  # 新增update路由    path('del', views.delete, name='del'),  # 新增del路由]

完成以上代码配置,我们就可以通过访问 URLhttp://127.0.0.1:8080/polls/update 实现第一条数据的更新操作,请求后返回页面如下:

图片

这样我们就把第一条数据的问题描述更新了,再次通过 URL http://127.0.0.1:8080/polls/query 查询下所有数据,可以看到返回页面如下:

图片

好,更新成功后,我们再试下删除数据了,通过查看删除相关代码是把 id 为2的数据删除了,这次我们访问的 URL http://127.0.0.1:8080/polls/del,然后返回删除后再次查询所有记录的页面,如下图:

图片

可以看到只剩下一条数据,说明我们已经删除成功了。

总结

本文为大家介绍了 Django 的模型,通过上面学习我们了解到模型功能的强大,为我们基于数据库的开发节省了大量工作量。Django还有模板,表单,路由,认证,基本的数据库管理等等内建功能,接下来将进一步的介绍 Django 提供的其他功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

总结 TCP 协议的相关特性

TCP协议段格式: 如图, 端口号: 是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念). 4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4&#xff0c;才是真正的报头长度,即TCP 报头最大长度,60…

基于Python的高校毕业生离校系统SpringBoot+Vue【源码+lw】

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、微信小程序、Python、Android、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&#x1f495…

Spring Security OAuth2.0认证授权

&#xff08;单体项目的认证&#xff0c;微服务项目的认证授权&#xff09; 1.基本概念 1.1 什么是认证 进入移动互联网时代&#xff0c;大家每天都在刷手机&#xff0c;常用的软件有微信、支付宝、头条等&#xff0c;下边拿微信来举例子说明认证相关的基本概念&#xff0c;在…

【bug】Unity无法创建项目

bug UnityHub无法创建项目 UnityHub无法创建项目 出现的问题&#xff1a;在创建新项目时弹出来一个 无法创建项目 尝试的方法&#xff1a; 刷新许可证 ❌没用退出账号重新登陆 ❌没用重启电脑 ❌没用 最后发现是什么问题呢&#xff1f; 2021.3.3这个版本我之前在资源管理器中…

C++------利用C++实现二叉搜索树【数据结构】

文章目录 二叉搜索树概念二叉搜索树的操作查找插入删除 二叉搜索树的应用 二叉搜索树 概念 什么是二叉搜索树&#xff0c;二叉搜索树就是指左孩子永远比根小右孩子永远比根大。这个规则适用于所有的子树。 上面的就是一棵二叉搜索树&#xff0c;我们还可以发现这棵树走一个中…

大语言模型与语义搜索;钉钉个人版启动内测,提供多项AI服务

&#x1f989; AI新闻 &#x1f680; 钉钉个人版启动内测&#xff0c;提供多项AI服务 摘要&#xff1a;钉钉个人版正式开始内测&#xff0c;面向小团队、个人用户、高校大学生等人群。该版本具有AI为核心的功能&#xff0c;包括文生文AI、文生图AI和角色化对话等。用户可通过…

LeetCode 2236. 判断根结点是否等于子结点之和

【LetMeFly】2236.判断根结点是否等于子结点之和 力扣题目链接&#xff1a;https://leetcode.cn/problems/root-equals-sum-of-children/ 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于…

学习网络编程No.3【socket理论实战】

引言&#xff1a; 北京时间&#xff1a;2023/8/12/15:32&#xff0c;自前天晚上更新完文章&#xff0c;看了一下鹅厂新出的《扫毒3》摆烂至现在&#xff0c;不知道是长大了&#xff0c;还是近年港片就那样&#xff0c;给我的感觉不是很好&#xff0c;也可能是国内市场对港片不…

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想使…

计算机视觉掩模区域与二值图像

掩模区域 在图像处理中&#xff0c;我们经常需要对图像中的某些特定区域进行操作&#xff0c;例如对某个区域进行滤波、变换、裁剪或者其他处理。为了实现这些操作&#xff0c;我们需要明确指定这些区域&#xff0c;这就是掩模区域的作用。 掩模区域通常由一个二值图像表示&…

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候&#xff0c;也能够触发一些操作呢&#xff1f;比如说发送通知&#xff0c;解决这个需求的办法有很多种选择&#xff0c;比如说官方推荐的WorkManager API&#xff0c;可以在后台执行一次性、耗时、定时的任务&#xff0c;但WorkManager是…

【开源项目】Stream-Query的入门使用和原理分析

前言 无意间发现了一个有趣的项目&#xff0c;Stream-Query。了解了一下其基本的功能&#xff0c;可以帮助开发者省去Mapper的编写。在开发中&#xff0c;我们会编写entity和mapper来完成业务代码&#xff0c;但是Stream-Query可以省去mapper&#xff0c;只写entity。 快速入…

Beats:安装及配置 Metricbeat (一)- 8.x

在我之前的文章&#xff1a; Beats&#xff1a;Beats 入门教程 &#xff08;一&#xff09;Beats&#xff1a;Beats 入门教程 &#xff08;二&#xff09; 我详细描述了如何在 Elastic Stack 7.x 安装及配置 Beats。在那里的安装&#xff0c;它通常不带有安全及 Elasticsearc…

OCR相关模块——版面分析技术、表格文本识别

OCR相关模块——版面分析技术、表格文本识别 版面分析技术表格识别技术 版面分析技术 版面分析模型&#xff1a;飞桨用到了yolov2检测模型&#xff0c;对文档图片中的文本、表格、图片、标题与列表区域进行检测。当前主流是用分割做。 表格识别技术 参考博文

Matplotlib数据可视化(一)

目录 1.Matplotlib简介 2.Matplotlib绘图基础 2.1 创建画布与子图 2.2 添加画布属性 2.3 绘图的保存与显示 1.Matplotlib简介 Matplotlib是一个用于绘制数据可视化图表的Python库。它提供了广泛的功能和灵活性&#xff0c;可以创建各种类型的图表&#xff0c;包括折线图、…

MAC QT开发攻略

文章目录 基础步骤安装QT、QTCreator安装CMakeNinja 安装Clion编译器在QTCreator中新建项目更改CMake生成器 导入Clion CMake生成文件 基础步骤 安装QT、QTCreator 安装CMake 由于clion需要使用cmake构建 Ninja Ninja下载 安装Clion编译器 Clion 2023.1.3 破解版安装教程…

微服务中间件--分布式事务

分布式事务 a.理论基础1) CAP定理2) BASE理论 b.Seata1) XA模式1.a) 实现XA模式 2) AT模式3) TCC模式3.a) 代码实现 4) Saga模式5) 四种模式对比6) TC的异地多机房容灾架构 a.理论基础 1) CAP定理 分布式系统有三个指标&#xff1a; Consistency&#xff08;一致性&#xff…

基于Java/springboot铁路物流数据平台的设计与实现

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;铁路物流数据平台当然也不能排除在外&#xff0c;从文档信息、铁路设计的统计和分析&#xff0c;在过程中会产生大量的、各…

GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

自己亲自实践&#xff1a; mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具&#xff0c;它可以将多个模块&#xff08;包括CSS、JavaScript、图片等&#xff09;打包成一个或多个静态资源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生产…

TiDB 多集群告警监控-中章-融合多集群 Grafana

作者&#xff1a; longzhuquan 原文来源&#xff1a; https://tidb.net/blog/ac730b0f 背景 随着公司XC改造步伐的前进&#xff0c;越来越多的业务选择 TiDB&#xff0c;由于各个业务之间需要物理隔离&#xff0c;避免不了的 TiDB 集群数量越来越多。虽然每套 TiDB 集群均有…