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)
五、时间字段的查询
"""
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)