前言
在日常开发中,需要大量对数据库进行增删改查操作。
如果头铁的话,使用原生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)
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 os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm_demo.settings")
django.setup()
from web import models
查询所有(all)
语法
例如:查询所有作者
author_list = models.Author.objects.all()
print(author_list)
执行结果
例如:查询所有图书,并且遍历详情
book_list = models.Book.objects.all()
for book in book_list:
print(book.title, book.price, book.PublishDate, book.publish)
执行结果
查询指定条件(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="张三").first()
print(author,type(author))
print(author.name,author.phone)
执行结果
filter支持多条件
假设有俩张三
如果我想取第二个张三咋办?
要是能写俩条件就好了比如这样name=张三 and age=22
。
注:filter后面只能跟filter或者first,filter里面的条件都是and查询
代码
author = models.Author.objects.filter(name="张三",age=22).first()
print(author,type(author))
print(author.name,author.phone)
执行结果
常用filter条件列表
熟悉Mysql的可能都知道,有=
,<
,<=
,like
等各种范围查询,同样,Django也同样支持!
filter
通过__
来构造条件
字段__contains="三"
字段__startswith="三"
字段__startswith="三"
字段__isnull=True
字段__isnull=False
字段__in=[1,2,3]
字段__gt=1
字段__gte=1
字段__lt=1
字段__lte=1
日期字段__year=2020
日期字段__month=3
日期字段__day=4
日期字段__gt|lt|...="2020-10-10"
import datetime
日期字段__gt|lt|...=datetime.date(2020,10,10)
日期字段__range=("2020-01-01","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="张三")
author = models.Author.objects.get(name="不存在")
author = models.Author.objects.filter(name="不存在").first()
所以,推荐使用filter
,如果确定只有一条,那就filter().first()
,如果需要多条,遍历即可!
query
在某些特殊情况下,我们可能对于查询的结果感到有些意外!
可能需要看看原生SQL是啥,这时候需要用到query
。
注:query
只能用在filter()
后面。
代码
sql = models.Author.objects.filter(name="李四").query
print(sql)
执行结果
总结
本篇通过一个类似实际的需求,进行了一个表结构设计。
有书表,出版社表,作者表,图书和作者多对多表。
以这几张表为例,进行Django ORM的学习。
学习了如何
查询所有,如何条件查询,filter常用条件有哪些。
get和filter().first()区别,如何通过query进行查看原生SQL。
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
用微笑告诉别人,今天的我比昨天强,今后也一样。
如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~
想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~
重磅!Python交流群已成立
为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)▲长按扫码