Django之ORM

这篇具有很好参考价值的文章主要介绍了Django之ORM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Django模型层之ORM介绍

使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。

如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据

Django之ORM

针对应用程序的数据操作,直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下

#1. sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
#2. 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题

 为了解决上述问题,django引入了ORM的概念,ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行

Django之ORM

基于图2所示,有了ORM框架,开发人员既不用再去考虑原生SQL的优化问题,也不用考虑数据库迁移的问题,ORM都帮我们做了优化且支持多种数据库,这极大地提升了我们的开发效率

二、ORM的使用之模型

在django的ORM框架中,继承自django.db.models.Model的类称之为模型类,或简称模型。

一个模型是关于你的数据,唯一的、决定性的信息源、它包含存储数据的基本字段和方法。

通常,每个模型都映射到一个数据库表。模型中的属性对应数据库表的字段

如下所示:原生SQL与ORM的模型对应关系

Django之ORM

三、ORM的使用之数据库迁移

1、创建模型

数据来源于数据库的表,而ORM的模型类对应数据库表,所以若我们想操作数据,必须先创建模型。

# 创建django项目,新建名为app01的app,在app01的models.py中创建模型
class Employee(models.Model):  # 必须是models.Model的子类
    id=models.AutoField(primary_key=True)

    name=models.CharField(max_length=16)

    gender=models.BooleanField(default=1)

    birth=models.DateField()

    department=models.CharField(max_length=30)

    salary=models.DecimalField(max_digits=10,decimal_places=1)

2、 配置settings.py

1.注册应用

但凡涉及到数据库同步操作的应用,都需要事先在settings.py的INSTALLED_APPS中完成注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # django2.x+版本
    'app01.apps.App01Config', # 如果默认已经添加了,则无需重复添加
    # 'app02.apps.App02Config', # 若有新增的app,按照规律依次添加即可
    
    # django1.x版本
    'app01',  # 直接写应用名字
    # 'app02'
]
2.配置后端数据库

django的orm支持多种数据库(如PostgreSQL、MySQL、SQLite、Oracle等),如果想将上述模型转为mysql数据库中的表,需要settings.py中配置DATABASES,如下

# 删除\注释掉原来的DATABASES配置项,新增下述配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库
        'NAME': 'db1',          # 要连接的数据库
        'USER': 'root',         # 链接数据库的用于名
        'PASSWORD': '',         # 链接数据库的用于名                  
        'HOST': '127.0.0.1',    # mysql服务监听的ip  
        'PORT': 3306,           # mysql服务监听的端口  
        'ATOMIC_REQUEST': True, #设置为True代表同一个http请求所对应的所有sql都放在一个事务中执行 
                                #(要么所有都成功,要么所有都失败),这是全局性的配置,如果要对某个
                                #http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 
        "AUTOCOMMIT":False, #全局取消自动提交,慎用
        'OPTIONS': {
            "init_command": "SET storage_engine=INNODB", #设置创建表的存储引擎为INNODB
            'isolation_level': "read committed",  # 默认为RC,可以设置成其他级别(详见下面解释)
        }
    }
}

"""
=================================》额外补充:
当运行并发负载时,来自不同会话的数据库事务(例如,处理不同请求的单独线程)可能会相互交互。 这些交互受每个会话的事务隔离级别的影响。 您可以在DATABASES中的数据库配置的OPTIONS部分中使用'isolation_level'条目设置连接的隔离级别。 此条目的有效值是四个标准隔离级别:

'read uncommitted'
'read committed'
'repeatable read'
'serializable'
或None来使用服务器配置的隔离级别。 
然而,Django最好使用read committed而不是MySQL的默认值repeatable read。 repeatable read可能导致数据丢失。
"""

强调!!!:在链接mysql数据库前,必须事先创建好数据库

mysql> create database db1; # 数据库名必须与settings.py中指定的名字对应上

3.配置日志

如果想打印orm转换过程中的sql,需要在settings中进行配置日志:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

首先执行下述命令来创建一个迁移

3、mysqlclient安装与兼容性问题

$ python manage.py makemigrations

会抛出异常

......
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

提示我们需要事先安装好mysqlclient,并且默认加载的mysqlclient是模块MySQLdb,需要安装MySQL-python,但目前python官方第三库中最新版MySQLdb 1.2.5对python解释器以及MySQL Server的支持如下,并不支持python3.0+

• 对Python解释器的支持

– CPython : 支持2.4到2.7

– PyPy(用python实现的python解释器) : 支持到最新版本

• 对MySQL Server的支持

– 3.23=< MySQL <= 5.5

为此,有人在github中创建了一个MySQLdb1分支 来支持Cpython3.0+解释器,可以参照官网进行安装mysqlclient · PyPI

除了使用MySQLdb作为MySQLclient之外,我们还有可以使用pymysql

• Python解释器支持:

– CPython : 2.7 and >= 3.5

– PyPy : Latest version

• MySQL Server支持:

– MySQL >= 5.5

– MariaDB >= 5.5

比起前者,pymysql直接支持Cpython3.0+,安装简单

pip3 install pymysql

但是因为Django默认加载的MySQLclient是MySQLdb,所以需要作出修改

Django之ORM

此时重新执行python manage.py makemigrations仍会抛出异常

......    
    File "/Users/liyang/PycharmProjects/egon_test/venv-3.8/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 37, in <module>
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

需要根据上述异常提示的文件base.py路径打开文件,注释下述两行
 

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

如果重新执行makemigrations命令,扔抛出异常

......
    File “xxx\lib\site-packages\django\db\backends\mysql\operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)
AttributeError: ‘str’ object has no attribute ‘decode’

需要根据上述异常提示的operations.py文件路径打开文件,把146行的decode修改为encode

ps:PyPI(Python Package Index)是Python官方的第三方库,所有人都可以下载或上传Python库到PyPI。可以访问PyPI · The Python Package Index,自行查看各个库的版本支持,

4、数据库迁移命令

最后在命令行中执行两条数据库迁移命令,即可在指定的数据库db1中创建表 :

$ python manage.py makemigrations
$ python manage.py migrate

# 注意:
# 1、makemigrations只是生成一个数据库迁移记录的文件,而migrate才是将更改真正提交到数据库执行
# 2、数据库迁移记录的文件存放于app01下的migrations文件夹里
# 3、了解:
如果要给迁移一个有意义的名称而不是生成的名称,则可以使用makemigrations --name选项:
python manage.py makemigrations --name xx app01 # 会在migrations目录下生成迁移文件0001_xx.py

python3 manage.py sqlmigrate app01 0001_xx  # 展示迁移的sql语句
python manage.py showmigrations # 项目的迁移及其状态。

注意:当我们直接去数据库里查看生成的表时,会发现数据库中的表与orm规定的并不一致,这完全是正常的,事实上,orm的字段约束就是不会全部体现在数据库的表中,比如我们为字段gender设置的默认值default=1,去数据库中查看会发现该字段的default部分为null

mysql> desc app01_employee; # 数据库中标签前会带有前缀app01_
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | int(11)       | NO   | PRI | NULL    | auto_increment |
| name       | varchar(16)   | NO   |     | NULL    |                |
| gender     | tinyint(1)    | NO   |     | NULL    |                |
| birth      | date          | NO   |     | NULL    |                |
| department | varchar(30)   | NO   |     | NULL    |                |
| salary     | decimal(10,1) | NO   |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+

,虽然数据库没有增加默认值,但是我们在使用orm插入值时,完全为gender字段插入空,orm会按照自己的约束将空转换成默认值后,再提交给数据库执行

5、模型字段的增、删、改

在表生成之后,如果需要增加、删除、修改表中字段,需要这么做

# 一:增加字段
#1.1、在模型类Employee里直接新增字段,强调:对于orm来说,新增的字段必须用default指定默认值
publish = models.CharField(max_length=12,default='人民出版社',null=True)
#1.2、重新执行那两条数据库迁移命令


# 二:删除字段
#2.1 直接注释掉字段
#2.2 重新执行那两条数据库迁移命令

# 三:修改字段
#2.1 将模型类中字段修改
#2.2 重新执行那两条数据库迁移命令

6、加载django配置

在开发django项目时,如果我们想跳过django的启动与操作流程,只测试某一部分的代码的功能,需要首先引入django的配置环境才可以

在任意路径下新建一个py文件(文件名任意),内容如下

import sys
import os
import django

# 1、将项目的根目录填入环境变量
BASE_DIR = os.path.dirname(传入项目所在的根目录)
sys.path.append(BASE_DIR)

# 2、引入项目的配置环境,然后无需启动django项目就可以使用其配置环境了
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
django.setup()

# 可以将上述代码粘贴进交互式环境,直接在交互式环境测试

if __name__ == "__main__":
	# 编写测试代码,直接运行本文件即可
    from app01.models import Employee

    all = Employee.objects.all().values()
    print(all)

四、基本使用简介

增加一条记录

obj=Employee(name="ly",gender=0,birth='1997-01-27',department="财务部",salary=100.1)
obj.save()

查询记录

obj = Employee.objects.filter(name="ly").first()  # 查询所有名字为ly的记录并取第一条
print(obj.id, obj.name, obj.birth)  # 输出1 Egon 1997-01-27

 修改记录

Employee.objects.filter(name="ly").update(name="LY") # 过滤出所有名字为ly的记录并将name字段改成大写LY

删除记录

Employee.objects.filter(name="LY").delete() # 过滤出所有名字为LY的记录并删除

五、orm简单示例

定一个Person模型,有两个属性first_name与last_name

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

first_name与last_name是这个模型的字段,每个字段都被指定为类属性,每个属性都映射到数据库列。

上面的Person模型将创建如下一个数据库表

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

一些注意事项:

1、数据库中生成的表会加上"app名_"作为前缀,如myapp_persion,也可以重新为别的名称,详见第四节 2、会自动添加一个id字段作为主键字段,但也可以重写此行为,详见第3.3小节 3、本例中的CREATE TABLE SQL是使用PostgreSQL语法格式化的,但值得注意的是Django使用的SQL是根据设置文件中指定的数据库后端定制

六、使用模型



一旦你定义了模型,你就需要告诉djano你将要使用这些模型。如何做到呢? 需要通过编辑配置文件settings.py,在配置项INSTALLED_APPS注册你包含模型文件 models.py所在的app

例如,如果你的app的模型在myapp.models里,INSTALLED_APPS配置如下

INSTALLED_APPS = [
    #...
    'myapp',
    #...
]

然后运行命令

python manage.py makemigrations
python manage.py migrate

Django 提供了基于 web 的管理工具用来管理我们的模型。如何使用呢 • 1、通常我们在生成项目时就会在 urls.py 中自动设置好,如下

urlpatterns = [
    path('admin/', admin.site.urls),
]

• 2、启动Django ,管理工具就可以运行了,在浏览器中访问 http://127.0.0.1:8000/admin/,得到如下界面:

• 3、你可以通过命令 python manage.py createsuperuser 来创建超级用户,如下所示:

# python manage.py createsuperuser
Username (leave blank to use 'root'): egon
Email address: admin@runoob.com
Password:
Password (again):
Superuser created successfully.

之后输入用户名密码登录,界面如下:

Django之ORM

• 4、为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin。比如,我们之前在 app01/models.py中已经创建了模型 Person 。修改 app01/admin.py:

from django.contrib import admin

# Register your models here.

from app01.models import Person
admin.site.register(Person)

刷新页面即可看到Person数据表,可以在模型类中新增str方法来控制记录的显示内容。文章来源地址https://www.toymoban.com/news/detail-513398.html

到了这里,关于Django之ORM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django Web开发(day4)——数据模型使用与填充网站数据(对数据库的基本操作)

    本博客将会涉及:  Django 数据模型的使用 视频数据的导入 admin 后台的使用  1、Django 数据模型的使用  在上一篇中完成了网站的数据模型的创建,在数据模型创建之后, Django 会为我们的数据模型创建一套数据库抽象的 API 接口,以供我们进行检索数据、创建数据、更新和修

    2024年01月18日
    浏览(54)
  • 第二章(一):Django框架的模型(Model)

    备注:这里是Django系列文章的所有文章的目录 第一章(一) : Django框架之创建项目/应用/templates、连接MYSQL、配置日志LOGGING、启动django项目 第一章(二):Django框架的模式、路由、视图; 第一章(三):Django框架的视图函数、视图类的认识及常规使用; 第一章(四):Django框架的模板

    2024年02月08日
    浏览(45)
  • Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

    当需要在网页应用程序中提供富文本编辑功能时,CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器,它提供了强大的功能和用户友好的界面,使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性: 所见即所得编辑 :CKEditor提供了所

    2024年02月16日
    浏览(57)
  • 介绍 Django 的模型字段 DecimalField

        DecimalField 是一种模型字段,相当于数据库字段的属性 decimal(x,y)。在 Python 中用一个 Decimal 实例来表示,表现为一个固定精度的十进制数。它使用 DecimalValidator 验证输入。     语法:     DecimalField 具有以下必需参数: DecimalField.max_digits 数字中允许的最大位

    2023年04月09日
    浏览(51)
  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)

     大家好,我是csdn的博主: lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主 lqj_本人擅长微信小程序,前端,python,等方面的知识 https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343 哔哩哔哩欢迎关注: 小淼Develop 小淼Develop的个人空间-小淼Develop个

    2024年02月03日
    浏览(81)
  • 开源大模型框架llama.cpp使用C++ api开发入门

    llama.cpp是一个C++编写的轻量级开源类AIGC大模型框架,可以支持在消费级普通设备上本地部署运行大模型,以及作为依赖库集成的到应用程序中提供类GPT的功能。 以下基于llama.cpp的源码利用C++ api来开发实例demo演示加载本地模型文件并提供GPT文本生成。 CMakeLists.txt main.cpp 注:

    2024年02月03日
    浏览(57)
  • Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

    Django框架是Python的常用web框架,遵循 MVC 设计模式的框架,采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的

    2024年02月16日
    浏览(43)
  • Django+Celery框架自动化定时任务开发

    本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等,从而取代Jenkins上的定时执行脚本和发送邮件等功能。** 自动化

    2024年04月15日
    浏览(47)
  • Python Web开发:Django与Flask框架

    Django和Flask都是Python中非常受欢迎的Web开发框架。虽然它们都是用于构建Web应用程序的工具,但它们在设计理念、使用方式和适用场景等方面存在一些差异。 Django Django是一个“大而全”的框架,遵循MVC设计模式。它内置了很多功能,如ORM(对象关系映射)、模板引擎、表单处

    2024年02月22日
    浏览(53)
  • 软件测试 | 测试开发 | Django+Celery框架自动化定时任务开发

    ** 本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等,从而取代Jenkins上的定时执行脚本和发送邮件等功能。** 自动

    2023年04月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包