[Django基础06]模型和数据库交互

2023-11-19

2. 数据库配置【MySQL】

通常情况下,如果你只是做测试使用,可以使用Django内置的数据库SQLite就完全可以满足需要了,我们在本次教程中,通过使用MySQL这个数据库来完成后续的功能操作

我们首先要做的是,在配置文件中指定数据库的配置,先简单了解一下

数据库配置,首先要配置对应的数据库引擎对象和数据库连接信息
在DATABASES的default配置中进行默认配置

  • ENGINE:数据库引擎配置,可以从django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysql或者django.db.backends.oracle中选择一个
  • NAME:数据库名称,也就是我们项目要连接的数据库名称,如果使用默认的SQLite,数据库就是一个保存在我们电脑上的文件,NAME就必须指定绝对路径(当然这是废话,Django已经帮我们把这些事情都做好了)
  • 同时还可以使用USERPASSWORDHOST等等这些配置来配置更加详细的信息

注意:如果在项目中使用的数据库不是默认的SQLite,请确保你的数据库是存在的

废话不说,上干货
打开mysite/mysite/settings.py配置文件,添加数据库连接配置信息

# 引入pymysql模块
import pymysql
# 指定按照mysqldb的方式使用
pymysql.install_as_MySQLdb()

# 修改DATABASES配置
DATABASES = {
    'default': {
        # 数据库连接字符串
        'ENGINE':"django.db.backends.mysql",
        # 数据库名称
        "NAME":"pydb",
        # 数据库登录账号
        "USER":"root",
        # 数据库登录密码
        "PASSWORD":"",
        # 数据库所在主机IP,本机可以不用填写
        "HOST":"",
        # 数据库连接端口,MySQL默认3306
        "PORT":"3306"
    }
}

这里需要注意,大家可以看到,在mysite/mysite/settings.py文件的开头,引入了pymysql并且调用了它的方法install_as_MySQLdb()
这是因为Django常规情况下使用的mysqldb模块来连接数据库,但是python3.4+的版本还没有对应的mysqldb,目前使用的是第三方的pymysql模块,所以这里进行了这样的改造。

骚年,期待你在使用到时候,官方能提供和Python3.6配套的mysqldb来进行数据库操作。或者你直接参与到官方的开发队伍中,那就更完美了~

3. 创建模型应用并和数据库交互

3.1. 创建模型对象

常规情况下,我们需要在程序中,通过类和对象来封装我们的数据,方便数据的统一管理和使用,Django中对模型对象的规范做的更加的统一了,通常情况下将模块应用对象会常见在应用的模块应用/models.py文件中

废话不说,直接上干货:
在我们mysite项目的polls应用中,创建模型对象

# 引入django.db模块中的models模块
from django.db import models

# 创建一个**问题**类型
class Question(models.Model):
    # 创建一个问题描述属性,指定为字符串类型,最大长度200个字符
    question_text = models.CharField(max_length = 200)
    # 创建一个发布时间属性,指定为日期时间类型
    pub_date = models.DateTimeField("date published")

# 创建一个**解决方案**类型
class Choice(models.Model):
    # 将解决方案和问题关联起来,通过外键的形式
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    # 解决方案的描述信息,字符串,最大长度200
    choice_text = models.CharField(max_length=200)
    # 解决方案的投票总数,整数类型,默认0
    votes = models.IntegerField(default = 0)

3.2. 管理模型对象

一旦创建好了我们的模型类型,需要在项目中使用这些模型和数据库中的数据进行交互,首先我们要做的是~将我们模块应用polls纳入到项目管理中

很神奇的一句话:“纳入到项目管理中”,难道之前就木有在项目管理中吗?那我们是在启动项目后怎么访问到polls引用的视图的呢?!

换一句话大家可能就明白了,你作为中华人民共和国的一等良民,国家财政会给你发补贴福利吗?不会!但是如果把你纳入到国家的编制中,你就可以享受国家财政给你发放的工资补贴福利等等资源了,这里也是一样,前面创建的polls应用只是项目中的一部分,我们只有通过类似编制的东东让项目mysitepolls添加一个编制,项目就可以处理模块应用polls/中的模型数据了

在我们项目中,通过项目的mysite/mysite/settings.py配置文件的INSTALLED_APPS选项来进行项目应用的管理

默认情况下mysite/mysite/settings.py配置信息如下

INSTALLED_APPS = [
    'django.contrib.admin',# 默认提供的后台管理网站
    'django.contrib.auth',# 权限认证模块
    'django.contrib.contenttypes',#内容编码框架模块
    'django.contrib.sessions',# session回话管理框架模块
    'django.contrib.messages',# 消息队列处理模块
    'django.contrib.staticfiles',# 项目静态文件管理模块
]

我们要做的是什么呢,打开模块应用polls/app.py应用描述文件,可以看到里面定义了模块应用的名称,对,说的就是它!!!!

from django.apps import AppConfig
# 模块应用的名称
class PollsConfig(AppConfig):
    name = 'polls'

我们修改mysite/mysite/settings.py配置文件,添加模块应用

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',# 默认提供的后台管理网站
    'django.contrib.auth',# 权限认证模块
    'django.contrib.contenttypes',#内容编码框架模块
    'django.contrib.sessions',# session回话管理框架模块
    'django.contrib.messages',# 消息队列处理模块
    'django.contrib.staticfiles',# 项目静态文件管理模块
]

至此~配置部分就完全OK啦

3.3. 使用模型对象

上面项目部分开发配置完成后,我们Django能做什么呢?

  • 自动创建模块应用中模型对应的数据表(Create Table <table_name>)
  • 自动生成访问Question和Choice模型对象的API接口

这么神奇?上干货:
执行如下命令,进行数据库同步:

python3 manage.py makemigrations polls

执行的结果你会看到:

makemigrations执行结果
运行makemigrations命令,就是告诉Django我们对指定的模型,如polls,进行了什么改变,并将这些改变信息存储起来

migrations会将这些改变信息保存在模块应用的migraions文件夹下,如上面的操作会生成这样一个文件:mysite/polls/migrations/0001_initial.py,打开直接就可以看到具体的描述信息了。

我们再填一把火,查看Django自动给我们创建的SQL语句吧

# 执行sqlmigrate命令得到刚才执行makemigrations命令生成的sql语句
python3 manage.py sqlmigrate polls 0001

执行结果如下:

D:\resp_work\PY_WORK\mysite>python3 manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`choice_text` varchar(200) NOT NULL,
`votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`question_text` varchar(200) NOT NULL,
`pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;

ALTER TABLE `polls_choice`
ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id`
FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);

COMMIT;

我们会看到一个很神奇的结果,我们创建的Question和Choice模型数据,被Django自动转换成了SQL语句了

注意问题:由migrations引发的臆想

  • 由makemigrations根据模型自动生成的sql语句,严重依赖指定的数据库,切记这样的SQL不是通用的,这里生成的SQL语句只能用于MySQL数据库
  • 主键是自动增长的(当然你也可以修改不让自动增长),并且会根据指定的数据库自动匹配,如auto_increment(MySQL)serial(PostgreSQL)integer primary key autoincrement(SQLite)等等
  • 默认情况下Django会自动给外键增加_id的形式命名(同样可以修改哦)
  • 最重要的是:makemigrations或者sqlmigrate命令,都不会在目标数据库自动执行,也就是SQL语句有了,但是还没有执行。这是为什么呢?因为毕竟自动的东西不一定满足需要~我们简单修改一下SQL然后执行,这样更加符合实际开发哦
  • 当然,如果不需要修改SQL,直接执行的话,运行python3 manage.py migrate命令就可以将改动应用到数据库了

3.4. 使用模型对象的API操作

在命令行通过shell启动应用,就可以直接进行python根据模型应用提供的API接口的访问测试了
执行如下命令:

python3 manage.py shell

就可以在命令行中,进行API的测试了

D:\resp_work\PY_WORK\mysite>python3 manage.py shell
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> Question.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'Question' is not defined
>>>
>>> from polls.models import Question, Choice
>>> Question.objects.all()# 查看所有的问题对象列表
<QuerySet []>
>>>
>>> from django.utils import timezone # 引入时区模块
>>> q = Question(question_text="What's new?", pub_date=timezone.now())# 创建一个问题对象
>>> q.save() # 保存到数据库
>>> q.id # 查看q对象的主键字段
1
>>> q.question_text# 查看q对象的问题描述字段
"What's new?"
>>> q.pub_date # 查看q对象的发布时间字段
datetime.datetime(2017, 6, 9, 2, 59, 43, 68178, tzinfo=<UTC>)
>>>
>>> q.question_text="What's up?" # 修改q对象的question_text属性值
>>> q.save()# 保存
>>>
>>> Question.objects.all() #查看所有的问题对象列表
<QuerySet [<Question: Question object>]>
>>>

来源:http://www.jianshu.com/p/5a9634c3e833

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Django基础06]模型和数据库交互 的相关文章

  • 分页节点

    动态调度技术 分页数据库 osg PageLOD 动态调度技术 如果数据庞大 那么是不可能一次性全部载入内存的 因此需要动态调度技术 动态调度技术 在显示当前视域中的场景元素的同时 预判下一步可能载入的数据 以及那些短时间内不会被看到的数据
  • win11共享打印机无法连接怎么办

    很多小伙伴都将电脑更新升级成Win11系统 当我们使用多台电脑却只有一台打印机时 就需要共享打印机却出现了Win11共享打印机无法连接的情况 遇到这种问题应该怎么解决呢 下面小编就给大家详细介绍一下Win11共享打印机无法连接的解决方法 大
  • hexo tags-标签设置-aloha

    打开博客界面里面的 config yml进行配置 打开如下 找到类似于下面这些的代码行 Directory source dir source public dir public tag dir tags 标签 archive dir ar
  • MySQL-group_concat()

    创建表格 CREATE TABLE dept emp emp no int 11 NOT NULL dept no char 4 NOT NULL from date date NOT NULL to date date NOT NULL
  • expandableListview实现侧滑删除

    本文地址 http blog csdn net xiehao 95 article details 44628491 使用swipelistview实现侧滑删除这样Demo已经很普及了 但是项目需要 expandableListview的i
  • 复习整理 Mask R-CNN

    理解Mask R CNN 文章目录 理解Mask R CNN 前言 一 简介 基础点 名词解释 简单复习 前言 为了综合复习 Mask R CNN 写一个博客 简言之 物体检测 产生一个切割mask 识别 和FasterR CNN区别 能生
  • spark-3.1.2兼容多版本hive

    2 3 9版本Hive的支持 直接在实例化SparkSession时 启用hive支持即可 例如 val spark SparkSession builder appName Spark Hive Example config spark
  • ThinkPHP 5 框架实现多语言 实例讲解

    ThinkPHP 5 框架实现多语言 今天给大家分享一篇tp5框架多语言的实例 第一步 您需要在配置文件中开启网站多语言 并添加语言允许列表 默认语言 default lang gt zh cn 语言允许列表 lang list gt zh
  • Oracle 用户锁定,解决办法

    启动cmd 窗口指令 切换中oracle 默认超级管理员账户 oracle 默认登入超级管理员 C Users Administratir gt sqlplus as sysdba 为admin 用户解锁 SQL gt alter user
  • CLIP-as-service 0.8.0 版本发布:新增支持大型 ONNX 模型文件

    CLIP as service 是一种用于编码图像和文本的低延迟 高可扩展性服务 它可以作为微服务轻松集成到神经搜索解决方案中 CLIP as service 0 8 0 现已正式发布 本次更新包含 3 个新增功能 1 个性能改进 1 个文
  • typeof 与 instanceof ,如何模拟实现一个 instanceof,有没有通用检测数据类型?

    书山有路勤为径 学海无涯苦作舟 金三银四 面试加油 冲 一 typeof 1 typeof 优点 缺点 优点 能够快速区分基本数据类型 缺点 不能将Object Array和Null区分 都返回object 2 typeof 作用 区分数据
  • 运营商线路细分_呼叫中心各种线路的区分

    对于一个呼叫中心系统来说 最重要的一部分当然是线路 关系着电话的呼出和呼入 那么你了解什么是呼叫中心的线路吗 今天来给大家普及一下市面上常见的一些线路 以及线路的区别 呼叫系统的线路其实就是呼入与呼出的电话号码 只是会以不同的方式接入到系统
  • 【经验分享】Windows/Ubuntu上如何使用api下载kaggle上的数据集

    1 下载kaggle的api 1 1 已经安装了Anaconda 打开cmd Windows 打开终端 Ubuntu conda activate 你的conda环境名称 这里我的环境叫做Pytorch conda activate Pyt
  • Spark的常用概念总结

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 基本概念 1 RDD的生成 2 RDD的存储 3 Dependency 4 Transformation和Action 4 1 Transformatio
  • 剑指Offer - 面试题25:合并俩个排序的链表

    题目 输入俩个递增排序的链表 合并这俩个链表并使新链表中的节点仍然是递增序列 例如下图链表1和链表2 合并后的升序链表为链表3 链表节点定义如下 typedef int TElemType 链表节点值的数据类型 struct ListNod
  • python 期货交易接口_量化交易 – 期货CTP接口与程序化(量化交易)的对接 1

    很多人写CTP都是为了自动交易 费好大劲 对多个策略进行历史测试 实盘运行 能随意编写策略 想改就改 想加就加 测试时 要能随意选择合约 周期 时间范围 参数范围 能随意设置滑点量 手续费 盘口差 保证金率 还有 要有组合测试 我要多合约
  • 若依框架前后端如何改端口号

    前端 在ruoyi ui中的vue config js中 下图为前端启动端口 下图为连接的后端接口 原理 为解决跨域问题 若依使用前端的反向代理 url请求前端进行代理 映射到后端 此处为dev模式 统一用proxy代理 因此只需修改内部的
  • 解决tqdm在jupyter中报错ImportError: IProgress not found. Please update jupyter and ipywidgets.

    解决方案 gt gt gt pip3 install ipywidgets
  • Qt5中使用lambda表达式

    Qt5中使用lambda表达式 https www cnblogs com yuankaituo p 5135750 html 利用lambda表达式实现点击按钮 关闭窗口或者传输信号 QPushbutton btn new QPushbu

随机推荐

  • 2020牛客多校第十场 E. Game

    题解 实际上从左往右先把所有能推到左边的都尽量平分到到这一部分去 即前缀和 s u m sum sum平分到 l r
  • 6.10行为型---备忘录模式

    每个人都有犯错误的时候 都希望有种 后悔药 能弥补自己的过失 让自己重新开始 但现实是残酷的 在计算机应用中 客户同样会常常犯错误 能否提供 后悔药 给他们呢 当然是可以的 而且是有必要的 这个功能由 备忘录模式 来实现 其实很多应用软件都
  • vscode远程连接失败解决方案

    vscode远程连接在更新了配置文件或者密钥信息更新后可能会出现远程连接失败 过程试图写入的管道不存在 该问题的主要有以下三种解决方案 1 在vscode SSH扩展设置中配置config文件的绝对位置 该文件一般位于 ssh文件夹中 C
  • CTF.show:web10

    和web9一样 先查看一下源码 右键查看源代码 进入style css 发现有index phps 在url处输入后 查看源码得到
  • MyBatis的增删改查操作(基于xml)

    文章目录 一 注意事项 1 占位符 2 增 删 改的返回值 3 查询操作 二 操作 1 新增 1 单条 2 批量 2 查询 1 多条记录 多字段 2 多条记录 单字段 3 单条记录 4 模糊查询 5 聚合值 6 返回列中包含查询参数 3 修
  • SpringBoot(3)整合MyBatis 和MybatisPlus

    SpringBoot 3 整合MyBatis 和MybatisPlus 1 整合MyBatis 1 1新建模块 1 2在pom xml中添加mysql驱动 1 2 1防止编译时不将静态资源编译进去 在pom xml中添加 1 3 appli
  • 【数值计算之二】数值积分之牛顿——科斯特公式:梯形、辛普森、辛普森3/8和布尔 & 高斯积分公式:勒让德、切比雪夫、拉盖尔和埃尔米特

    import numpy as np from scipy integrate import quad from sympy import init printing import matplotlib pyplot as plt 数值积分
  • Rust全局变量

    在Rust中 全局变量可以分为两种 编译期初始化的全局变量 const创建常量 static创建静态变量 Atomic创建原子类型 运行期初始化的全局变量 lazy static用于懒初始化 Box leak利用内存泄漏将一个变量的生命周期
  • non-protected broadcast场景分析及解决

    non protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver 有时在运行过程中在logcat工具中会发现大片的飘红消息 要消除这些错误信息 需要在广播的 Sender 和 R
  • WSL和VMware不兼容,安装了WSL之后VMware启动不起来

    WSL依赖于hyper v必须开启 而VMware不依赖这个 必须关闭 CMD管理员模式启动 输入bcdedit set hypervisorlaunchtype auto开启 则可以使用WSL CMD管理员模式启动 输入bcdedit s
  • ubuntn 下安装nginx 报错 ./configure: error: C compiler cc is not found

    原因是 error C compiler cc is not found c编译器没有安装 解决办法 需要安装编译工具及库文件 网址很多文章没有详细写nginx 安装教程 跟着教程敲命令然后出错了 安装nginx需要安装编译工具及库文件参考
  • 分布式锁解决方案_Zookeeper分布式锁原理

    通过召zk实现分布式锁可靠性时最高的 公平锁和可重入锁的原理 取水秩序 1 取水之前 先取号 2 号排在前面的 就可以先取水 3 先到的排在前面 那些后到的 一个一个挨着 在井边排成一队 公平锁 这种排队取水模型 就是一种锁的模型 什么是可
  • docker遇到问题集合

    1 docker images下删除镜像提示image is being used by stopped container 1b817324f96a 依次执行下面命令 docker ps a grep Exited awk print 1
  • 爬虫实例十一 全国城市房价排行

    目标网址 https www creprice cn rank index html 这一看就是个静态页面 没有用任何反爬措施所以很好爬 直接发送请求解析数据就可以了 完整代码 import requests from lxml impor
  • 睿智的目标检测54——Tensorflow2 搭建YoloX目标检测平台

    睿智的目标检测54 Tensorflow2 搭建YoloX目标检测平台 学习前言 源码下载 YoloX改进的部分 不完全 YoloX实现思路 一 整体结构解析 二 网络结构解析 1 主干网络CSPDarknet介绍 2 构建FPN特征金字塔
  • ElementUI浅尝辄止26:Notification 通知

    悬浮出现在页面角落 显示全局的通知提醒消息 1 如何使用 适用性广泛的通知栏 Notification 组件提供通知功能 Element 注册了 notify方法 接收一个options字面量参数 在最简单的情况下 你可以设置title字段
  • 资源路径嵌套异常,检测不到:IOException parsing XML document from class path resource [applicationContext.xml]

    org springframework beans factory BeanDefinitionStoreException IOException parsing XML document from class path resource
  • ARP与ARP代理的理解

    1 ARP 首先讲到ARP ARP是地址解析协议 它的作用是在以太网环境下 通过第3层的网络层IP地址来找寻2层数据链路层的MAC地址 得到一张ARP缓存表 转发数据的时候根据ARP缓存表来进行传输 下图详细说明数据传输时ARP是如何一步步
  • TVP新书上架

    新书速递 近期 在腾讯云 TVP 联合出书计划中 腾讯云 TVP 山金孝老师推出了新书 融合 产业数字化转型的十大关键技术 融合 产业数字化转型的十大关键技术 作者 山金孝 李琦 中译出版社 内容简介 数字经济已成为高质量发展的新引擎 数字
  • [Django基础06]模型和数据库交互

    2 数据库配置 MySQL 通常情况下 如果你只是做测试使用 可以使用Django内置的数据库SQLite就完全可以满足需要了 我们在本次教程中 通过使用MySQL这个数据库来完成后续的功能操作 我们首先要做的是 在配置文件中指定数据库的配