Django框架中模型的用法


Posted in Python onJune 10, 2022

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。

如果你没安装 mysql 驱动,可以执行以下命令安装:

sudo pip3 install pymysql

一、Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

Django框架中模型的用法

使用 ORM 的好处:

  • 提高开发效率。
  • 不同数据库可以平滑切换。

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

  • 1、ORM 会将 Python 代码转成为 SQL 语句。
  • 2、SQL 语句通过 pymysql 传送到数据库服务端。
  • 3、在数据库中执行 SQL 语句并将结果返回。

ORM 对应关系表:

Django框架中模型的用法

二、数据库配置

Django 如何使用 mysql 数据库

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

例如常见 runoob 数据库,编码指定为 utf8:

create database runoob default charset=utf8;

我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

HelloWorld/HelloWorld/settings.py: 文件代码:

DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'runoob', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

如果你使用了 Python2.x 版本这里添加了中文注释,所以你需要在 HelloWorld/settings.py 文件头部添加 # -*- coding: UTF-8 -*-。

上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。

接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()

三、定义模型

1、创建 APP

Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:

django-admin.py startapp TestModel

目录结构如下:

HelloWorld
|-- HelloWorld
|-- manage.py
...
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py

我们修改 TestModel/models.py 文件,代码如下:

HelloWorld/TestModel/models.py: 文件代码:

# models.py
from django.db import models
 
class Test(models.Model):
    name = models.CharField(max_length=20)

以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',               # 添加此项
)

在命令行中运行:

$ python3 manage.py migrate   # 创建表结构

$ python3 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate TestModel   # 创建表结构

看到几行 "Creating table…" 的字样,你的数据表就创建好了。

Creating tables ...
……
Creating table TestModel_test  #我们自定义的表
……

表名组成结构为:应用名_类名(如:TestModel_test)。

注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

2、常见报错信息

如果执行以上命令时会出现如下报错信息:

Django框架中模型的用法

原因是 MySQLclient 目前只支持到 Python3.4,因此如果使用的更高版本的 python,需要修改如下:

通过报错信息的文件路径找到 ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的 base.py 文件,把这两行代码注释掉(代码在文件开头部分):

if version < (1, 3, 13):
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

Django框架中模型的用法

一般点报错的代码文件路径信息,会自动跳转到报错文件中行数,此时我们在报错的代码行数注释掉。

如果出现以下报错信息:

Django框架中模型的用法

我们点报错的代码文件路径,跳转到报错文件中行数,此时我们在报错的代码行数之前加上:

query = query.encode()

Django框架中模型的用法

四、数据库操作

接下来我们在 HelloWorld 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

HelloWorld/HelloWorld/urls.py: 文件代码:

from django.urls import path
 
from . import views,testdb
 
urlpatterns = [
    path('runoob/', views.runoob),
    path('testdb/', testdb.testdb),
]

1、添加数据

添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    test1 = Test(name='runoob')
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。

输出结果如下:

Django框架中模型的用法

2、获取数据

Django提供了多种方式来获取数据库的内容,如下代码所示:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 初始化
    response = ""
    response1 = ""
    
    
    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = Test.objects.all()
        
    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = Test.objects.filter(id=1) 
    
    # 获取单个对象
    response3 = Test.objects.get(id=1) 
    
    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    Test.objects.order_by('name')[0:2]
    
    #数据排序
    Test.objects.order_by("id")
    
    # 上面的方法可以连锁使用
    Test.objects.filter(name="runoob").order_by("id")
    
    # 输出所有数据
    for var in list:
        response1 += var.name + " "
    response = response1
    return HttpResponse("<p>" + response + "</p>")

3、更新数据

修改数据可以使用 save() 或 update():

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = Test.objects.get(id=1)
    test1.name = 'Google'
    test1.save()
    
    # 另外一种方式
    #Test.objects.filter(id=1).update(name='Google')
    
    # 修改所有的列
    # Test.objects.all().update(name='Google')
    
    return HttpResponse("<p>修改成功</p>")

4、删除数据

删除数据库中的对象只需调用该对象的delete()方法即可:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 删除id=1的数据
    test1 = Test.objects.get(id=1)
    test1.delete()
    
    # 另外一种方式
    # Test.objects.filter(id=1).delete()
    
    # 删除所有数据
    # Test.objects.all().delete()
    
    return HttpResponse("<p>删除成功</p>")

到此这篇关于Django框架模型用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。


Tags in this post...

Python 相关文章推荐
python中os操作文件及文件路径实例汇总
Jan 15 Python
python复制与引用用法分析
Apr 08 Python
Python反转序列的方法实例分析
Mar 21 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
python list转矩阵的实例讲解
Aug 04 Python
python占位符输入方式实例
May 27 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
python绘制随机网络图形示例
Nov 21 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
如何通过命令行进入python
Jul 06 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
python实现简单的三子棋游戏
Apr 28 Python
Django框架中视图的用法
Jun 10 #Python
python基础之//、/与%的区别详解
Jun 10 #Python
Django框架中表单的用法
Jun 10 #Python
移除Selenium中window.navigator.webdriver值
Jun 10 #Python
Django框架模板用法详解
Jun 10 #Python
python库Tsmoothie模块数据平滑化异常点抓取
使用Django框架创建项目
Jun 10 #Python
You might like
SSI指令
2006/11/25 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
javascript的函数作用域
2014/11/12 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python图像常规操作
2017/11/11 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
python的dict判断key是否存在的方法
2020/12/09 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
求职信需要的五点内容
2014/02/01 职场文书
婚礼主持词
2014/03/13 职场文书
护士长竞聘书
2014/03/31 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL