9、Django_ORM_数据的创建以及增删改查

2019-10-06  本文已影响0人  猪儿打滚

一、查询集QuerySet

二、过滤器

返回list/多个结果的过滤器
返回一个对象的过滤器
查询集的特点
查询集索引

当查询集返回的是列表时,就可以使用下标的方式来获取我们想要的内容。

def AddressAPI(request):
    # 获取第2、3、4项
    address_values = AddressInfo.objects.all()[1:3]
    # 构造上下文
    context = {F'AddressInfo:{address_values}'}
    return render(request, 'address.html', context)

三、查询集的查询条件

address = AddressInfo.objects.filter(id__exact = 1)  # 查询id为1的地址

2.contains:判断包含

address = AddressInfo.objects.filter(name__contains = '广')  # 查询地址名称有广的地址

3.startswith/endswith:以什么开头/结尾
4.isnull:是否为null

address = AddressInfo.objects.filter(pid__isnull = true)  # 查询pid为null的地址

5.in:是否包含在范围内

address = AddressInfo.address.filter(id__in = [1,3])  # 查询id为1或3的地址

6.gt、gte、lt、lte:大于、大于等于、小于、小
7.exclude:条件以外的数据

address = AddressInfo.objects.filter(id__exclude = 1)   # 查询id不为1的地址

8.year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行查询

books = BookInfo.objects.filter(pub_time__year = 2000)  # 查询2000年发表的书籍

9.datetime.date

from datetime import date
books = BookInfo.objects.filter(pub_time__gt = date(2000,1,1))  # 查询2000年1月1号以后发布的书籍

10.多条件查询:或(使用|隔开查询条件)

BookInfo.objects.filter(id__gt = 1 | pub_time__year = 2000)  # 查询id大于1或发布年份是2000年的数据

11.多条件查询:与(使用,隔开查询条件)

BookInfo.objects.filter(id__gt = 1 , pub_time__year = 2000)  # 查询id大于1,并且发布年份是2000年的数据

12.链式查询:多个filter()进行查询(其它过滤器也可以这样)

BookInfo.objects.filter(id__gt = 1).filter(pub_time__year = 2000) # 在查询id大于1的结果集上,再查询发布年份是2000年的数据

13.获取查询集的第一个元素以及最后一个元素:first()last()

BookInfo.objects.filter(id__gt = 1).first()
BookInfo.objects.filter(id__gt = 1).last()

14.排序order_by('字段/-字段')

BookInfo.objects.filter(id__gt = 1).order_by('name') # 结果按照name排序,ascall码从小到大
BookInfo.objects.filter(id__gt = 1).order_by('-name') # 结果按照name排序,ascall码从大到小
BookInfo.objects.filter(id__gt = 1).order_by('id', 'name') # 结果先按照id排序,如果相同,则按照name排序

PS.
1.exact、contains、startswith、endswith这几个运算符都区分大小写,如需不区分大小写,只需要在前面加上i即可:iexact、icontains、istartswitch、iendswith

四、F对象和Q对象

from django.db.models import F
F("属性名/表字段")

2.例子
2.1.查询评论量大于阅读量的书籍

books = BookInfo.objects.filter(commentcount__gt = F('readcount'))

2.2.查询评论量大于阅读量2倍的书籍

books = BookInfo.objects.filter(commentcount__gt = F('readcount' * 2))
from django.db.models import Q
# |:或
Q(属性名/表字段1__条件运算符=值) |  Q(属性名/表字段2__条件运算符=值)   # 查询满足第一个条件或第二个条件的数据
# ,:且
Q(属性名/表字段1__条件运算符=值) ,  Q(属性名/表字段2__条件运算符=值)  # 查询满足第一个条件和第二个条件的数据
# 组合
Q(属性名/表字段1__条件运算符=值) ,  Q(属性名/表字段2__条件运算符=值)  |  Q(属性名/表字段3__条件运算符=值)  # 查询满足条件1且(条件2或条件3)的数据

2.1.或:|

books = BookInfo.objects.filter(Q(readcount__gt = 10) | Q(id__lt) = 5)  # 查询阅读量大于10或id小于5的书籍

2.2.且:,

books = BookInfo.objects.filter(Q(readcount__gt = 10) , Q(id__lt) = 5)  # 查询阅读量大于10且id小于5的书籍

2.3.不等于/取反:~

books = BookInfo.objects.filter(~Q(readcount__gt = 10) , Q(id__lt) = 5)  # 查询阅读量小于等于10且id小于5的书籍

2.4.组合

PS.如果有其它关键字条件,Q对象需要在关键字条件后面

books = BookInfo.objects.filter(pub_time = 2000 , Q(id__lt) = 5)  # pub_time是关键字

关于Q对象更详细看文章:https://www.cnblogs.com/huchong/p/8027962.html

五、聚合函数

from django.db.models import Sum

def books(request):
    # 统计所有书籍的总阅读量
    readcount = BookInfo.objects.aggregate(Sum('readcount'))
    # 构造上下文
    context = {'readcount': readcount}
    return  render(request, 'Book/book.html', context)

六、关联查询(objects前面用的是哪个class,返回的就是哪个class对象)

一对多、多对多关联查询(基础关联)
 # 先查询方老师
teacher = Teacher.objects.get(nickname = '方老师')
# 再通过方老师查询所有相关的任务信息
classInfo = teacher.classinfo_set.all()
# 先查询课程
class = ClassInfo.object.get(title = 'python课程')
# 再通过关联查询对应的老师
teacher = class.teacher
内连接查询
# 原始内连接sql语句:
select p.name, b.name from peopleinfo as p inner join bookinfo as b on p.book_id = b.id where b.name = "红楼梦";

对应语句:

peopleInfos = PeopleInfo.objects.filter(book__name='红楼梦')
bookInfos = BookInfo.books.filter(peopleinfo__description__contains='红')
自关联查询

自关联的表结构:对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以设计成一张表,内部的关系字段指向本表的主键
说明:关系属性使用self指向本类,要求null和blank允许为空,因为一级数据是没有父级的
更多看之前的文章:https://www.jianshu.com/p/08c1be3dc9b2

七、LIKE语句中转义百分符号和下划线

在sql语句中,%有特殊的作用,Django可以转义%_,这样就可以和普通字符一样使用

xxx.objects.filter(headline__contains='%')
# 相当于sql:
SELECT ... WHERE headline LIKE '%\%%';

八、创建数据/生成数据表中的数据

#### 方法1
# 1.创建模型类对象,此时sql还未执行
one_value = Userinfo(username='hello', password='hi')
# 2.调用save方法,执行sql语句,生成数据
one_value.save()

#### 方法2
# 执行sql语句,生成数据,返回的是模型类对象
Userinfo.objects.create(username='hi', password='hello')
from .model.animal import Animal
from .model.cat import Cat

animal = Animal.objects.get(pk = 1)
cat1 = Cat.objects.create(named='xiaomi')  
cat2 = Cat.objects.create(named='xiaohei')

animal.cats.add(cat1, cat2)    # 保存多对多字段

八、修改数据和更新数据

value = Animal.objects.get(id=1)
value.namede = 'haha'
value.save()
# 普通字段
Animal.objects.filter(id=1).update(named = 'hahaha')
# ForeignKey字段
c = Cat.objects.get(id=2)  # 想要指向的新模型实例
Animal.objects.all().update(cat=c)
for item in my_queryset:
    item.save()
# THIS WILL RAISE A FieldError
>>> Entry.objects.update(headline=F('blog__name'))

九、删除数据

先获取数据,再删除数据

value = Animal.objects.get(id=1)
value.delete() # 该方法将返回被删除对象的总数量和一个字典,字典包含了每种被删除对象的类型和该类型的数量
# 支持批量删除
Animal.objects.filter(named='haha').delete()
Animal.objecets.all().delete()

PS.本文参考:
https://blog.csdn.net/kan2016/article/details/82868636/https://www.cnblogs.com/huchong/p/8027962.html

上一篇下一篇

猜你喜欢

热点阅读