标题:django QuerySet | 作者: catfish | 时间:2020年01月06日
暂无法显示图片

中双下方法

在django中,自己定义的字段名中不能带有两个下划线,就是因为存在中双下方法。中双下方法一般应用于三个场景。

通用查询字段

与filter连用,进行塞选与查找。

objs = blog.objects.filter(readnum__gt=100)   # 获得博客中浏览量大于100的博客对象。

跨关系查询

通过正向与反向关联,来找到其他相关数据类型的字段。

user = blog.objects.get(author__username="catfish")    # 找到用户名中叫catfish的使用者

其中models.py对应的数据类型为:

from django.db import models
from django.contrib.auth.models import User

class Blog(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    readnum = models.IntegerField()
    content = models.TextField()

聚合中默认生成的字典中的key值

聚合中如果不指定字典中的键值则会出现默认键值:

>>> from django.db.models import Sum
>>> blog = Blog.objects.aggregate(Sum('readnum'))    # 阅读量求和
{'readnum__sum': 999999999999999999}

Django QuerySet

我觉得官网很好,推荐官网:https://docs.djangoproject.com/en/3.0/ref/models/querysets

返回一个QuerySet的查询方法

filter, exclude 筛选提取。annotate 聚合,在返回对象中添加属性值。order_by排序,正小到大,负大到小,可以在其中使用跨关系查询的字段,'?'随机排序。reverse把QuerySet反向,QuerySet不支持反向切片,想用反向切片可以用此方法后再切片。values提取里面的属性进行分组,变成字典形式,如果为空则提取所有属性,与annotate连用可以进行分组求和。value_list返回列表中带有值的元组,当为一元元组时,可以设置flat=True属性把它变成一个基本数据类型,如果非一元元组,设置这个值会报错。date第一个参数是类中的日期字段,第二个参数取值有'year','month','day','week',第三个可选参数默认order='ASC'表示日期从小到大,如果反向就是order='DESC'表示从大到小。datetime与date差不多,区别是第二个参数去值为'year','month','week','day','hour','minute','second'。none返回空的查询集。all表示所有。union多个QuerySet的并集,intersection交集,defference差集。select_related指定一个一对一或者多对一对象通道,引用这个对象是不会再次访问数据库的的,对于计算量较为复杂或者需要多次使用这个对象的查询可以提高性能,减少计算资源消耗,prefetch_related指定一个一对多或着多对多对象,这两个常与for循环连用。defer指定延迟检索字段,如果数据库中某一数据类型转换成python数据类型太过于复杂,需要消耗大量的资源可以使用这个方法来告诉python后检索它。onlydefer相反。using如果某个项目使用多个数据库,用来指定在指定数据库搜寻而不是用默认的数据库。raw进行原生的sql语句查询。extra将会被弃用。distinct消除重复的行,里面的参数在PostgreSQL中能够指定。

不返回QuerySet的查询方法

get只获取一个对象,其他的都会报错。create创建一个对象。get_or_create返回一个二元元组,第一个是对象,第二个是是否创建的Boolean值。update_or_create返回一个二元元组,参数defaults={}字典,用来更新数据类型。bulk_create QuerySet对象列表,用于批量插入,第二个可选参数是batch_size,用来指定列表数目和长度,默认是999。bluk_update批量保存,第一个参数是对象列表,第二个参数是指定要更新数据类型列表,第三个参数是可选参数batch_size指定更新的对象列表的长度。count数目。in_bulk指定一个独一无二的值,返回一个字典,使这个值对应一个对象。lastest指定一个日期字段,返回最新的对象,earliest返回最早的对象。first返回第一个对象,last返回最后一个对象。aggregate聚合,返回字典。exists是否不是空QuerySet列表,更快。update指定更新的内容。delete删除。explain告诉你这个查询它做了什么,返回是一个字符串。as_manager返回示例的class方法。

数据库函数

引入

from django.db.models import *

文档

https://docs.djangoproject.com/en/3.0/ref/models/database-functions/

F和Q

两个字段做比较用F查询

from django.db.models import F

Book.objects.filter(kucun__gt=F('maichu')*3)

逻辑关系用Q查询

使用Q查询时,要把Q查询写到前面,否则会报错。常见关系有且(&), 或(|), 非(~)。

from django.models.db import Q

Book.objects.filter(maichu__gt=1000, price__lt=100)       // 且
Book.objects.filter(Q(maichu__10)| Q(price__lt=100)) // 或

 

我要评论

没有登录?请先登录后再评论

最新评论

暂无人评论,来抢个沙发吧!