Django-ORM的基本操作

Django-ORM的基本操作

表结构如下:
from django.db import models
class Book(models.Model):
	BookId = models.AutoField(primary_key = True)	#定义主键id
    bookName = models.CharField(max_length = 50, verbose_name = "书名")
    authorId = models.ForeignKey("app.Author", on_delete=models.DO_NOTHING)#外键关联
    publicTime = models.DateTimeField(auto_now_add = True)

class Author(models.Model):
    authorId = models.AutoField(primary_key = True)
    authorName = models.CharField(max_length = 50, verbose_name = "作者名字")
    age = models.IntegerField(blank=True, null=True)
    sex = models.CharField(max_length = 10, verbose_name = "性别")

models的定义是为了把数据库表映射为python的 对象。

类名对应数据表的名字, 类的字段对应数据表的字段。

一个类的实例 映射数据表中的一条数据。

queryset对象是django的定义,包含 多个实例对象的可迭代对象

一、单条数据对象的基本操作

#增加数据,两种方法,都返回数据对象,第二种需要执行save()提交数据。
author_obj = Author.objects.create(authorId = 1, authorName = "小明", age = 18)

author_obj = Author(authorId = 1, authorName = "小明", age = 18)
author_obj.save()

#删除数据
author_obj.delete()

#修改数据,直接赋值,最后执行 author_obj.save() 提交修改
author_obj.authorName = "小红"
author_obj.authorId = 2
author_obj.save()

#查询数据,该方法只能查询唯一的数据,如果查询的字段重复,会报错。
author_obj = Author.objects.get(authorId = 1)

#没有查询到数据,会创建一个。
author_obj = Author.objects.get_or_create(authorId = 1)
print(author_obj)
<Author: Author object (1)>

二、queryset对象的基本操作

#取出数据表中所有的数据, 返回queryset对象。
#注:数据量很大的时候,不要使用,否则内存会称爆。
author_queryset = Author.objects.all()

#查询数据库中authorName 等于 “小明”的所有数据,返回queryset对象。
author_queryset = Author.objects.filter(authorName = "小明")

#查询数据库中authorName 不等于 “小明”的所有数据。
author_queryset = Author.objects.exclude(authorName = "小明")

#批量更新queryset中的所有对象, 接收 任意关键字参数
author_queryset.update(authorName = "小李", age = 10)
author_queryset.update(**{"authorName" :"小李", "age" :10})
print(author_queryset)
<QuerySet [<Author: RxSclass object (1)>, <Author: Author object (2)>, ....]>
#包含多个Author对象的可迭代。

for author_obj in author_queryset:
    print(author_obj)
<Author: Author object (1)>
<Author: Author object (2)>

三、字段的常用查询

#大于等于小于
Author.objects.filter(age__gt = 10)			#查询年龄大于10的
Author.objects.filter(age__gte = 10)		#大于等于
Author.objects.filter(age__lt = 10)			#小于
Author.objects.filter(age__lte = 10)		#小于等于

#查询 age 在 10-20中的数据
Author.objects.filter(age__range = [10, 20])

#查询 age 在 可迭代对象中 的所有数据
Author.objects.filter(age__in = [1, 2, 3, 4])

#查询 authorName 中包含 “T” 字母的数据
Author.objects.filter(authorName__contains = "T")	#大小写不敏感
Author.objects.filter(authorName__icontains = "T")	#大小写敏感匹配

#查询 authorName以 “小” 字开始的数据
Author.objects.filter(authorName__startswith = "小")
Author.objects.filter(authorName__istartswith = "小")

#查询 authorName以 “红” 字结尾的数据
Author.objects.filter(authorName__endswith = "红")
Author.objects.filter(authorName__iendswith = "红")

四、QuerySet 的常用方法

注:调用以下方法都返回 QuerySet 对象

author_queryset = Author.objects.filter(authorName = "小明")

#索引和切片。该方法对应数据库的limit查询。
author_queryset[0]
author_queryset[0:10]

#返回 queryset 中的第一条、最后一条数据对象。
author_queryset.first()
author_queryset.last()

#返回queryset的长度。
author_queryset.count()

#根据 authorId 字段排序:升序、降序
author_queryset.order_by('authorId')
author_queryset.order_by('-authorId')

#查询出 需要的字段 
#values方法的每个对象以dict形式返回
#values_list方法的每个对象以tuple形式返回
author_queryset.values('authorId', "authorName")
author_queryset.values_list('authorId', "authorName")

#根据authorName去重查询
author_queryset.values("authorName").distinct()

#根据authorName分组、查询每一组的数量。
from django.db.models import Count,Max,Min,Avg,Sum,Value
author_queryset.values("authorName").annotate(authorCount = Count("authorId"))


from django.db.models.functions import Upper,Lower,Left,Right,Substr,Concat
#常用方法
"""
Upper、Lower 大小写
Left、Right  左右切片字符串,接收索引长度参数
Substr		 截取字符串,接收 起始值和截取长度
Concat		 拼接多个字符串
"""
author_queryset.values(Upper("authorName"))
Left("authorName", 5)
Substr("authorName", 2)
#必须拼接都是字符串的字段
Concat( "sex", "authorName")
Concat( Value("你好啊,"), "authorName")   


from django.db.models import Q,F
"""
Q:可以对查询方法进行封装
“|” 和 “&” 表示 “or”和“and”
“~”表示 not取反
"""
author_queryset = Author.object.filter(Q(age = 18) | Q(authorId__gt = 10))
author_queryset = Author.object.filter(Q(age = 18) & ~Q(authorId__gt = 10))

"""
F : 查询数据后,把数据 放在内存之后进行的操作
"""
author_queryset.values(F("age") + 1)

五、时间字段的查询

Django-ORM的基本操作
Django-ORM的基本操作

"""
range、in、gt、lt、gte、lte 方法和上边的查询对应

year、month、day、hour、minute、second、week_day   年月日、时分秒、周

isnull  查询字段为 空的数据, 适用于所有类型的字段。
"""
book.object.filter(publicTime__second = 10)

六、外键的关联查询

book_obj = book.object.get(pk = 1)
book_queryset = book.object.filter(publicTime__second = 10)

#使用values、或者values_list方法时候
book_queryset.values(authorName = F("authorId__authorName"), "bookId", "bookName")

#直接调用属性, 返回 Author的实例对象
book_obj.authorId
book_obj.authorId.authorName

#查询 author 对象 发布的所有书籍
author_obj = Author.object.filter(pk = 1)
author_obj.book_set.all() #类名转小写,后边加_set
#也可以使用book的filter来查询
book.object.filter(authorId = author_obj)
上一篇:SQL优化 MySQL版 - 单表优化及细节详讲


下一篇:SQL 存储过程里调用另一个存储过程