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. 在菜单…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
