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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
在Windows8上的搭建Python和Django环境
Jul 03 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
Python中字典的基础知识归纳小结
Aug 19 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
Python面向对象之继承代码详解
Jan 29 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Python 获取项目根路径的代码
Sep 27 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
Django 用户认证Auth组件的使用
Nov 30 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
php下使用无限生命期Session的方法
2007/03/16 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python遍历pandas数据方法总结
2018/02/09 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
django教程如何自学
2020/07/31 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
重构Python代码的六个实例
2020/11/25 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
机电一体化专业推荐信
2013/12/03 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
爱心捐书倡议书
2015/04/27 职场文书
安全责任协议书范本
2016/03/23 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android