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__.pyimport 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)
这里有以下几点需要注意:
-
每个模型被定义为 django.db.models.Model 类的子类。
-
每个模型有一些类变量,它们都表示模型里的一个数据库字段。
-
每个字段都是 Field 类的实例,如 CharField 对应数据库中的字符串字段。
-
每个 Field 类实例变量的名字也是字段名,如 question_text,定义时需要遵循数据库字段规则。
-
实例变量的名字可以定义备注名,方便代码理解,如 pub_date = models.DateTimeField('发布日期')。
-
某些 Field 类实例定义时需要参数,还有一些可选参数,对应数据库表结构,如 CharField 类需要定义长度max_length。
-
使用 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 questionquestionList = 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 提供的其他功能。
相关文章:
Python Django 模型概述与应用
今天来为大家介绍 Django 框架的模型部分,模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,…...
Golang Gorm 更新字段 save update updates
更新和删除操作的前提条件都是要在找到数据的情况下,先要查询到数据才可以做操作。 更新的前提的先查询到记录,Save保存所有字段,用于单个记录的全字段更新它会保控所有字段,即使零值也会保存。 在更新和删除之前,要利…...
springBoot 配置文件引入 redis 的相关参数说明
在Spring Boot应用中使用Redis作为缓存或数据存储时,可以在应用的配置文件中配置相关参数。下面是常用的Redis配置参数及其说明: spring.redis.host: Redis服务器主机地址,默认为localhost。spring.redis.port: Redis服务器端口,…...
Docker的使用心得:简化开发与部署的利器
开发与测试的无缝衔接: Docker让开发与测试之间的切换变得前所未有的顺畅。我可以在本地开发环境中创建一个与生产环境一致的Docker容器,这样不仅可以确保开发过程中不会出现意外问题,还可以在测试阶段避免不必要的繁琐配置。 跨平台的可移植…...
vue3 基于element plus对el-pagination进行二次封装
vue3 基于element plus对el-pagination进行二次封装 1、前言2、在components文件夹中新建pagination.vue文件3、在组件内使用分页 1、前言 在vue3项目中,如果每个列表页都敲一遍分页方法,显然是不合理的,那么,下面我将基于elemen…...
RuntimeError: result type Float can‘t be cast to the desired output type __int64报错解决方法
小白刚开始学习YOLOv5,跟随老哥的步骤走了一遍目标检测--手把手教你搭建自己的YOLOv5目标检测平台 最后训练最后一步出现RuntimeError: result type Float can‘t be cast to the desired output type __int64报错 解决方法:找到5.0版报错的loss.py中最…...
解析Python爬虫常见异常及处理方法
作为专业爬虫程序猿长期混迹于爬虫ip解决方案中,我们经常会遇到各种各样的异常情况。在爬虫开发过程中,处理这些异常是不可或缺的一部分。本文将为大家总结常见的Python爬虫异常,并分享相应的处理方法,帮助你避免绊倒在爬虫之路上…...
详解Spring的循环依赖问题、三级缓存解决方案源码分析
0、基础:Bean的生命周期 在Spring中,由于IOC的控制反转,创建对象不再是简单的new出来,而是交给Spring去创建,会经历一系列Bean的生命周期才创建出相应的对象。而循环依赖问题也是由Bean的生命周期过程导致的问题&#…...
oracle分析函数学习
0、建表及插入测试数据 --CREATE TEST TABLE AND INSERT TEST DATA. create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2));insert into students values(1, 111, g, 80 ); insert into students values(1, 111, j, 80 ); …...
代码随想录训练营day17|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 v...
TOC 前言 代码随想录算法训练营day17 一、Leetcode 110.平衡二叉树 1.题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#x…...
C# Thread用法
C# 中的线程(Thread)是一种并发执行的机制,允许同时执行多个代码块,从而提高程序的性能和响应性。下面是关于如何使用 C# 线程的一些基本用法: 1. 创建线程: 使用 System.Threading 命名空间中的 Thread 类…...
新榜 | CityWalk本地生活商业价值洞察报告
如果说现在有人问,最新的网络热词是什么? “CityWalk”,这可能是大多数人的答案。 近段时间,“CityWalk”刷屏了各种社交媒体,给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢,这个在社交媒体引发热议的词汇背后又…...
LVS负载均衡集群-NAT模式部署
集群 集群:将多台主机作为一个整体,然后对外提供相同的服务 集群使用场景:高并发的场景 集群的分类 1.负载均衡器集群 减少响应延迟,提高并发处理的能力 2,高可用集群 增强系统的稳定性可靠性&…...
C++学习笔记总结练习:effective 学习日志
准则 1.少使用define define所定义的常量会在预处理的时候被替代,出错编译器不容易找到错误。而且还没有作用范围限制,推荐使用constdefine宏定义的函数,容易出错,而且参数需要加上小括号,推荐使用inline有的类中例如…...
Vue教程(五):样式绑定——class和style
1、样式代码准备 样式提前准备 <style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{border: 4px solid red;background-color: rgba(255, 255, 0, 0.644);background: linear-gradient(30deg, yellow, pink, orange, yellow);}.sad{border: 4px …...
开放网关架构演进
作者:庄文弘(弘智) 淘宝开放平台是阿里与外部生态互联互通的重要开放途径,通过开放的产品技术把阿里经济体一系列基础服务,像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴,推动行业的…...
torch一些操作
Pytorch文档 Pytorch 官方文档 https://pytorch.org/docs/stable/index.html pytorch 里的一些基础tensor操作讲的不错 https://blog.csdn.net/abc13526222160/category_8614343.html 关于pytorch的Broadcast,合并与分割,数学运算,属性统计以及高阶操作 https://blog.csd…...
ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性
论文地址:https://arxiv.org/abs/2307.08209 项目主页:https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic),对感知算法的延…...
软件工程模型-架构师之路(四)
软件工程模型 敏捷开发: 个体和交互 胜过 过程和工具、可以工作的软件 胜过 面面俱到的文件、客户合作胜过合同谈判、响应变化 胜过 循序计划。(适应需求变化,积极响应) 敏捷开发与其他结构化方法区别特点:面向人的…...
ubuntu20.04共享文件夹—— /mnt/hgfs里没有共享文件夹
参考文章:https://blog.csdn.net/Edwinwzy/article/details/129580636 虚拟机启用共享文件夹后,/mnt/hgfs下面为空,使用 vmware-hgfsclient 查看设置的共享文件夹名字也是为空。 解决方法: 1. 重新安装vmware tools. 在菜单…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
