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.py
from django.db import models
class 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.py
INSTALLED_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 polls
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
执行成功后,就可以再执行 migrate
命令,将你在模型中定义的数据库修改同步到应用的数据库表结构上,执行结果如下:
$ python manage.py migrate
Operations to perform:
Apply all migrations: polls
Running migrations:
Applying polls.0001_initial... OK
数据库
迁移
操作被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。
模型操作
对模型对象的操作,本质上就是数据库数据的操作。下面我们就通过对模型对象操作实现对数据库记录基本的CURD操作。
新增数据
编辑 TestProject
项目下polls/views.py
文件代码,通过访问URL
在 Question
模型对应表中添加数据。
# polls/views.py
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
from polls.models import Choice, Question
from django.utils import timezone
def 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.py
from django.urls import path
from . import views
urlpatterns = [
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.py
from django.urls import path
from . import views
urlpatterns = [
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.py
from django.urls import path
from . import views
urlpatterns = [
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. 在菜单…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...