前言在日常开发中,需要对数据库进行大量的增删改查操作。如果你脑袋硬,最好使用原生的SQL,毕竟它具有高性能和灵活性。但通常情况下,我们不需要这么苛刻的性能,也没有那么多刁钻的要求。使用原生SQL,我们通常使用简单快速的ORM来进行增删改查。下面我们就来了解一下Django的ORM操作。表结构设计还是以实际为准。观点看法。假设,现在我需要设计一个简单的图书馆管理系统,是我买的那种书,而不是图书馆里的书!!!想了想,首先要有一个书单,里面存放的是书的信息,至少是这样的。不过转念一想,看来我要出书,肯定需要出版社帮我出。肯定不能自己发布,所以就这样了。又想了想,书肯定是一个人写的,肯定有作者,所以需要一个作者表,应该是这样的。又想了想,普通人编这本书有点难度,而且一般都是多人完成,所以大概有这么一张表。其实上面还少了一点。书籍需要属于出版社,所以最终的表结构应该是这样的!Django模型代码来自django.dbimportmodels#Author表classAuthor(models.Model):name=models.CharField(verbose_name="Author'sname",max_length=8)age=models.IntegerField(verbose_name="Author'sage")phone=models.CharField(verbose_name="作者联系方式",max_length=11)#PressclassPublish(models.Model):title=models.CharField(verbose_name="出版商名称",max_length=16)phone=models.CharField(verbose_name="出版联系方式",max_length=11)#BookclassBook(models.Model):title=models.CharField(verbose_name="书名",max_length=32)price=models.DecimalField(verbose_name="Price",max_digits=5,decimal_places=2)PublishDate=models.DateField(verbose_name="第一版日期")publish=models.ForeignKey(to=Publish,verbose_name="PublicationHouse",on_delete=models.CASCADE)#Book许多作者classBookManyAuthor(models.Model):book=models.ForeignKey(to=Book,verbose_name="Book",on_delete=models.CASCADE)author=models.ForeignKey(to=Author,verbose_name="Owner",on_delete=models.CASCADE)Mysql.sql数据与上面Excel图一致!web_author.sqlweb_book.sqlweb_bookmanyauthor.sqlweb_publish.sql这个查询操作单独使用DjangoORM,不需要运行Django,所以不用写url什么的!导入前importosimportdjango#django_orm_demo是我的项目名os.environ.setdefault("DJANGO_SETTINGS_MODULE","django_orm_demo.settings")django.setup()#导入模型必须在django之后.setup()fromwebimportmodels查询所有(all)语法models..objects.all()例如:查询所有作者author_list=models.Author.objects.all()print(author_list)执行结果例如:查询所有Books,并遍历详情book_list=models。Book.objects.all()forbookinbook_list:print(book.title,book.price,book.PublishDate,book.publish)执行结果查询指定条件(过滤器)语法models..objects.filter()例如:查询张三的信息author=models.Author.objects.filter(name="张三")print(author)print(author.name)执行结果好像发现了一个错误,'QuerySet'对象没有属性“名称”这是因为filter()查询可能有多个值,比如name=Zhangsan,可能有很多张三!那么得到的是一个列表,注意第一个红圈,如果我清楚的知道它只是一个值,就好像取了第一个值,怎么办?first先过,得到第一个值,也是模型类对象代码author=models.Author.objects.filter(name="张三").first()print(author,type(author))print(author.name,author.phone)执行结果过滤支持多种条件假设有两个张三,想得到第二个张三怎么办?如果我可以只写两个条件。例如姓名=张三,年龄=22。注意:filter只能跟filter或者first,filter中的条件是allandquerycode#filter中的多个条件是andqueryauthor=models.Author.objects.filter(name="张三",age=22).first()print(author,type(author))print(author.name,author.phone)常用过滤条件的执行结果列表,熟悉Mysql的可能知道有各种范围查询比如=,<,<=,like等,同样的,Django也支持!filter使用__构造条件#包含三个字段__contains="three"#NativeSQL条件:wherefieldlike"%three%"#从threeFields开始__startswith="three"#NativeSQL条件:wherefieldlike"three%"#以三个结束字段__startswith="three"#NativeSQL条件:wherefieldlike"%three"#Emptyfield__isnull=True#NativeSQLcondition:wherefieldISNULL#Notemptyfield__isnull=False#NativeSQLcondition:wherefieldISNOTNULL#infield__in=[1,2,3]#NativeSQL条件:wherefieldIN(1,2,3)#>field__gt=1#NativeSQL条件:wherefield>1#>=field__gte=1#NativeSQL条件:wherefield>=1#2020-10-10#也可以是时间类型importdatetime日期字段__gt|lt|...=datetime.date(2020,10,10)#同上#时间范围过滤日期字段__range=("2020-01-01","2020-06-01")#NativeSQL条件:where时间字段BETWEEN2020-01-01AND2020-06-01datefield__range=(datetime.date(2020,1,1),datetime.date(2020,6,1))#同上get其实我们只需要获取一个值的时候,也可以使用getcodeauthor=models.Author.objects.get(name="Lisi")print(author,type(author))print(author.name,author.phone)执行结果但是不推荐这样get,原因如下如果获取的get条件有两个或两个以上的值,就会报错。如果get条件取不到值,还是会报错。示例代码author=models.Author.objects.get(name="张三")#error:get()returnedmorethanoneAuthor--itreturned2!author=models.Author.objects.get(name="不存在")#error:Authormatchingquerydoesnotexist.author=models.Author.objects.filter(name="doesnotexist").first()#Result:None所以,建议使用filter,如果确定只有一个,再filter().first(),如果需要多个项,遍历即可!在某些特殊情况下,我们可能会对查询结果感到有些意外!我们可能需要看看nativeSQL是什么,这时候就需要用到query了。注意:query只能在filter()之后使用。代码sql=models.Author.objects.filter(name="李四").queryprint(sql)执行结果总结本文根据一个类似实际情况的需求设计表结构。有书籍表、出版商表、作者表、书籍和作者多对多表。以这些表为例来学习DjangoORM。学习了如何查询全部,如何按条件查询,以及filter的常用条件有哪些。get和filter().first()的区别,如何通过q??uery查看nativeSQL。如果您在操作过程中有什么问题,记得在下方留言,我们看到会第一时间解决。微笑着告诉别人,今天的我比昨天好,以后也一样。本文转载自微信公众号《Python爬虫与数据挖掘》,可通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。