前言

在日常开发中,需要大量对数据库进行增删改查操作。

如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活。

但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多刁钻的需求用原生SQL

通常会使用简单快捷的ORM进行增删改查

一起看学习一下Django的ORM操作吧

表结构设计

还是从实际角度出发。

假设,现在我需要设计一个简单的图书管理系统,是那种买的书,不是图书馆的书!!!

我想了想,首先,肯定有一个图书表,专门存放图书的信息,最起码是这样的。

但是又想了想,似乎我的书想发布,肯定是需要一个出版社帮我发布的,我肯定不能自己发布所以是这样子的。

又想了想,书肯定是人写的,肯定要有作者,所以还需要一个作者表,应该是这样子的。

又想了想,这一本书如果让一般人编,难度有点大啊,一般都是多人一起完成的,所以大概还有这样一张表。

其实,上述漏点了一个东西,图书需要归属一个出版社的,所以,最终表结构应该是这样的!

Django models代码

from django.db import models

# 作者表class Author(models.Model):name = models.CharField(verbose_name="作者姓名", max_length=8)age = models.IntegerField(verbose_name="作者年龄")phone = models.CharField(verbose_name="作者联系方式", max_length=11)

# 出版社class Publish(models.Model):title = models.CharField(verbose_name="出版社名称", max_length=16)phone = models.CharField(verbose_name="出版联系方式", max_length=11)

# 图书class Book(models.Model):title = models.CharField(verbose_name="书名", max_length=32)price = models.DecimalField(verbose_name="价格", max_digits=5, decimal_places=2)PublishDate = models.DateField(verbose_name="初版日期")publish = models.ForeignKey(to=Publish, verbose_name="所属出版社", on_delete=models.CASCADE)

# 图书Many作者class BookManyAuthor(models.Model):book = models.ForeignKey(to=Book, verbose_name="所属图书", on_delete=models.CASCADE)author = models.ForeignKey(to=Author, verbose_name="所属作者", on_delete=models.CASCADE)

Mysql.sql

数据同上述Excel图一致!

web_author.sql

web_book.sql

web_bookmanyauthor.sql

web_publish.sql

查询操作

本次采用单独使用Django ORM的方式,不需要将Django运行起来,所以也不需要写url什么的了!

前置导入

import osimport django

# django_orm_demo为我的项目名称os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm_demo.settings")django.setup

# 导入models一定要在 django.setup 之后from web import models

查询所有(all)

语法

models..objects.all

例如:查询所有作者

author_list = models.Author.objects.allprint(author_list)

执行结果

例如:查询所有图书,并且遍历详情

book_list = models.Book.objects.allfor book in book_list:print(book.title, book.price, book.PublishDate, book.publish)

执行结果

查询指定条件(filter)

语法

models..objects.filter()

例如:查询张三的信息

author = models.Author.objects.filter(name="张三")print(author)print(author.name)

执行结果

似乎你发现了个错误,

'QuerySet' object has no attribute 'name'

这是因为filter()查询出来的,可能不止一个值,就像name=张三,可能有很多张三!

所以获取的是一个列表,注意第一个红色圈圈,如果我明明知道就是一个值,也就像取第一个值,咋办?

first

通过first,拿到的就是第一个值,同时也是模型类对象

代码

author = models.Author.objects.filter(name="张三").firstprint(author,type(author))print(author.name,author.phone)

执行结果

filter支持多条件

假设有俩张三

如果我想取第二个张三咋办?

要是能写俩条件就好了比如这样name=张三 and age=22。

注:filter后面只能跟filter或者first,filter里面的条件都是and查询

代码

# filter里面多个条件是and查询author = models.Author.objects.filter(name="张三",age=22).firstprint(author,type(author))print(author.name,author.phone)

执行结果

常用filter条件列表

熟悉Mysql的可能都知道,有=,

filter通过__来构造条件

# 包含三字段__contains="三" # 原生SQL条件:where 字段 like "%三%"# 以三开头字段__startswith="三" # 原生SQL条件:where 字段 like "三%"# 以三结尾字段__startswith="三" # 原生SQL条件:where 字段 like "%三"# 为空字段__is=True # 原生SQL条件:where 字段 IS# 不为空字段__is=False # 原生SQL条件:where 字段 IS NOT# in字段__in=[1,2,3] # 原生SQL条件:where 字段 IN (1, 2, 3)# >字段__gt=1 # 原生SQL条件:where 字段 > 1# >=字段__gte=1 # 原生SQL条件:where 字段 >= 1# 2020-10-10# 比大小还可以是时间类型import datetime日期字段__gt|lt|...=datetime.date(2020,10,10)# 同上# 时间范围筛选日期字段__range=("2020-01-01","2020-06-01") # 原生SQL条件:where 时间字段 BETWEEN 2020-01-01 AND 2020-06-01日期字段__range=(datetime.date(2020,1,1),datetime.date(2020,6,1)) # 同上

get

其实当我们只需要获取一个值时,还可以使用get。

代码

author = models.Author.objects.get(name="李四")print(author,type(author))print(author.name,author.phone)

执行结果

但是这个get不太推荐使用,原因如下

如果get条件获取了俩或俩以上的值,会报错。

如果get条件获取不到值,还是会报错。

示例代码

author = models.Author.objects.get(name="张三")# error:get returned more than one Author -- it returned 2!

author = models.Author.objects.get(name="不存在")# error:Author matching query does not exist.author = models.Author.objects.filter(name="不存在").first# 结果:None

所以,推荐使用filter,如果确定只有一条,那就filter.first,如果需要多条,遍历即可!

query

在某些特殊情况下,我们可能对于查询的结果感到有些意外!

可能需要看看原生SQL是啥,这时候需要用到query。

注:query只能用在filter后面。

代码

sql = models.Author.objects.filter(name="李四").queryprint(sql)

执行结果

总结

本篇通过一个类似实际的需求,进行了一个表结构设计。

有书表,出版社表,作者表,图书和作者多对多表。

以这几张表为例,进行Django ORM的学习。

学习了如何查询所有,如何条件查询,filter常用条件有哪些。

get和filter.first区别,如何通过query进行查看原生SQL。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

用微笑告诉别人,今天的我比昨天强,今后也一样。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

django mysql orm教程_带你了解Django ORM操作(基础篇)相关推荐

  1. django mysql数据同步_[django同步数据库]Django去操作已经存在数据的数据库

    数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头开始一个新的项目 但是呢, ...

  2. python自动化教程_Python自动化开发实战视频课程-全新基础篇_Python教程

    教程名称:Python自动化开发实战视频课程-全新基础篇 课程目录: 0001.51CTO学院-01Pythons10 day1 开课前言- _* N, R+ w/ T 0001.51CTO学院-01 ...

  3. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题

    本人以前是做客户端的,做后端没多久. 一直有一个问题困扰我,正好现在手上有一个系统在做. 系统逻辑是写一个爬虫在网上爬取一个网站的信息, 经过加工处理后,使用 django 来展示和交互. 表结构简化 ...

  4. mysql桦仔_带您理解SQLSERVER是如何执行一个查询的

    带您理解SQLSERVER是如何执行一个查询的 看这篇文章之前,阁下可以先看一下下面的文章 翻译自: 不知道是哪篇文章抄哪篇文章的 ,不管他了,我也偷他们的文章,嘎嘎嘎嘎嘎... 我将会用尽本人的所有 ...

  5. 织梦mysql安装教程_新手教程:DedeCmsV5.7 SP1详细安装步骤(2)

    新手教程:DedeCmsV5.7 SP1详细安装步骤(2) 在DedeAMPZ上搭建DedeCMS V5.7 SP1正式版 1.解压DedeCMS V5.7 SP1正式版压缩包后,将uploads文件 ...

  6. 凤舞天骄mysql安装教程_全程教你架设局域网或单机凤舞天骄私服

    我已经架设成功,我比较笨,看了教程也不会弄,后来我就下载了一个人家改好的服务端,的确是不错,我把地址发给大家,然后大家去看,里面有客户端下载工具,直接就可以下7500客户端,然后大家不要按他的步骤来做 ...

  7. c mysql安装教程,Mysql安装教程_完成版(吐血式安装)

    每次在不同操作系统中安装oracle和mysql这些常规数据库,步骤就那么点儿,但是遇见的错误却是千差万别.. 记一次耗时两天的mysql数据库安装新得,有耐心,有毅力,憋生气. 1.官网上下载免安装 ...

  8. pypy mysql 兼容_PyPy运行Django+MySQL简单教程

    PyPy是Python开发者为了更好的Hack Python创建的项目.此外,PyPy比CPython是更加灵活,易于使用和试验,以制定具体的功能在不同 PyPy是Python开发者为了更好的Hack ...

  9. django mysql数据同步_[django自动同步数据库]Django数据库同步操作技巧详解

    同步数据库: 使用上述两条命令同步数据库 1.认识migrations目录: migrations目录作用:用来存放通过makemigrations命令生成的数据库脚本,里面的生成的脚本不要轻易修改. ...

最新文章

  1. C++11中default的使用
  2. 浅析python 中__name__ = '__main__' 的作用
  3. 如何用pycharm对比两段代码(或两个文件的代码)
  4. ISE应用入门的一些问题
  5. Android实现截图分享qq,微信
  6. 十四、K8s calico网络的通信及网络策略
  7. C#基础概念 代码样例
  8. c++ 之 template函数模板
  9. U盘PE安装原版Win10系统
  10. python 绘图中文显示_Python绘图实现显示中文
  11. Caffe框架的使用
  12. 次世代游戏角色的制作过程
  13. cie1931 python绘制_科学网-gnuplot与CIE1931 XYZ三刺激值曲线-范学良的博文
  14. 适合新手小白,一个人一部手机如何做自媒体?看完我的你就懂了
  15. oracle library is not loaded解决方法
  16. vue子组件mounted不执行_vue 页面回退mounted函数不执行的解决方案
  17. python入门——python基础语法
  18. 计算机竞赛进省队可以保送吗,厉害!物理竞赛8名学子入选省队!信息学竞赛5人获清北保送资格,他们来自……...
  19. surface pro可以编程c语言吗,surface pro 3就是surface3吗?surface pro 4就是surface4吗
  20. 推荐有关微信开发的十个开源项目

热门文章

  1. centos开机启动zookeeper
  2. 空气球+操作系统,海尔智能家居雄心何在?
  3. 单词转换(map对象)
  4. Django 各类配置选项全集
  5. MYSQL人事工资管理系统-插入数据(三)
  6. 计算机桌面是哪个盘,windows的桌面文件夹是哪个?
  7. 如何来理解Python中的字典数据类型
  8. java开发面试复试_面试java开发,面试官会问哪些问题?
  9. 在 Linux 上使用 lspci 命令查看硬件情况
  10. Java游戏服务器系列之Netty详解