Django-数据库查询方法

 链式调用:

在视图函数中,比如调用  模型.objects.filter  这个filter方法实际上拷贝的是QuerySet类中的方法,从数据库取值时,返回的类型也是一个QuerySet类型,所以我们可以链式调用:

# 过滤出id大于等于1且id小于等于3的数据
article = Artilce.objects.filter(id__gte=1).filter(id__lte=3)

集合查询:

过滤器:返回查询集的方法叫做过滤器

之所以叫查询集,因为使用下列方法,返回的就是一个查询集,其实就是一个特殊的list而已

# 查询集
<QuerySet [xxx, xxx]>

#查询集的type
<class 'django.db.models.query.QuerySet'>

1、all( ) 全部查询,配合切片实现限制查询

User.objects.all()[10:20] # 左闭右开

2、filter( ) 过滤,返回满足条件的

User.objects.filter(name='吕星辰') # 返回name为'吕星辰'的集合,等号左边为数据库的字段名

3、exclude( ) 排除,排除满足条件的

User.objects.exclude(pk=1) # 过滤掉主键为1的字段(除了主键为1的字段其它全查出来)

4、order_by( ) 以某种规则排序

5、values( ) 返回一个对象字典的列表,像json一样,但是还是一个查询集!

5.1 、可以使用list() 函数转为列表类型。。。

User.objects.all().values()
#<QuerySet [{'id': 1, 'k': 'v', 'k': 'v'},··· ···]> 

5.2 、也可以在values中指定参数查询指定的字段:

 

单值查询:

单值查询:就是返回的一个值,而不是一个集合,这是我为它起的名字,便于理解。

1、get()仅返回单个满足条件的对象,如果未能查到则抛出DoesNotExist异常

User.objects.get(pk=1)

2、count()返回当前查询的总数

User.objects.filter(pk__gt=1).count()

3、first()返回第一个对象,如果没有返回None

4、last()返回最后一个对象,如果没有返回None

5、exist()判断查询集是否有数据,有返回True

 

字段查询表达式:

所为的字段查询表达式,就是为查询设置条件,字段查询表达式<<只>>可以作为filter()、exclude()、get()的参数,实现where子句。

格式如下:

name为要查询的字段;然后便便需要加俩下划线,紧接着查询条件,等号后边为值( 所以数据库字段名禁止命名有俩下划线 __的任何名字!)

filter(name__查询的条件='查询的值')

1、exact()严格等于,其实在上边所有的查询都是以下写法的简写!

User.objects.filter(name__exact='lxc') # 等于 User.objects.filter(name='lxc') 

2、contains是否包含,大小写敏感!

qs = User.objects.all(title__contains='天')
#把title中包含 '天' 的字段全部查出来

3、startswith、endswith 以什么开头或结尾的,大小写敏感

User.objects.filter(username__startswith='星')

4、是否为 null、isnull、isnotnull

5、iexact、icontains、istartswith、iendswith ( i 的意思是忽略大小写 )

6、in 是否在指定的范围中 

不管有多少个符合条件的,它只返回第一个符合条件的字段,没有则返回一个空的查询集

User.objects.filter(pk__in=[2,3,4,100,600])  # 这里边2、3、4都符合条件,但是它只返回 主键为2的字段

7、gt、gte 大于、大于等于 (对应的英文单词为:greater than、equal  )

lt、lte 小于、小于等于 (对应的英文单词为:less than、equal)

filter(pk__gt=3) # 返回主键大于3的
filter(pk__lt=3) # 返回主键小于3的

8、year 年、month 月、week_day 周几、hour 小时、minute 分、second 秒 

filter(title__year=2019) # 把取出title是2019的字段给取出来

 

Q对象

虽然Django提供传入条件的方式,但是不方便,Q对象是用来做条件的 与 、或、 非

它可以使用 & (与)  |(或)   ~(非)来构造复杂的逻辑表达式

首先,引入Q对象

from django.db.models import Q

比如:

User.objects.filter(Q(pk__gt=5) & Q(pk__lt=10)) # 与 —— 大于5 小于10
User.objects.filter(Q(name='星辰') | Q(name='小西')) # 或
User.object.filter(~Q(name='星辰')) # 非

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值