Django filter中contains 用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django filter中contains 用法相关的知识,希望对你有一定的参考价值。
参考技术A 用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords')....在这种情况下,如果你跟踪 sql 语句,你会发现,SQL 语句会生成 select .... like bianry '%keywords%', 如果是这样的语句,在某些情况是下是会出问题的,也就是说查询出来的数据可能会比你预计的少。
如果你用 raw sql 查总数 select count(*) from table where like '%keywords%' 得到数量可能比你用ORM 采用上面的方式得到的数据多,问题就在于生成的条件问题。
后来查询了 django 说明,如果把ORM 语句变成:object.filter(tag__icontains='keywords').... 就好了。
注意contains ,icontains 的区别. 后来从django官网查到了说明:
django查询过滤
查询过滤:
models.UserProfile.objects.filter(name__contains=‘liu‘) 忽略大小写在contains前面加个i
models.UserProfile.objects.filter(id__range=[1:3]) 根据id查找想要的数据
models.UserProfile.objects.all()[:5] 查询前5条
models.UserProfile..objects.order_by(‘name‘)[0]排序取第一条
models.UserProfile..objects.filter(name__startwith=‘liuyi‘) 查找 以什么开头的
models.UserProfile..objects.filter(name__endwith=‘liuyi‘) 查找 以什么j结尾的
单表内不同字段对比:
from django.db.models import F
models.UserProfile.objects.filter(name_gt=F(‘age‘))
单表内and查询:
frmo django.db.models import F
models.UserProfile.bojects.filter(name_gt=F(‘age‘),age_lt=F(‘name‘))
单表内or查询:
from django.db.models import Q
models.UserProfile.objects.filter(Q(name__gt=F(‘name‘))|Q(age__gt=F(‘age‘)))
原有数据自增:
entry.objects.all().update(age=F(‘age‘)+1)
orm聚合 求平均值
from django.db.models import Avg,Sum,Min,Max
models.UuserProfile.objects.all().aggregate(Avg(‘age‘))
orm聚合 求最大值,最小值,和
from django.db.models import Avg,Sum,Min,Max
models.UserProfile.objects.all().aggregate(Max(‘age‘))
models.UserProfile.objects.all().aggregate(ri=Sum(F(‘age‘)/F(‘name‘)),output_field=FloatField())
统计:
haha.objects.annotate(ri=Count(‘group‘)) group是字段,不清楚能不能直接写别的表名
以上是关于Django filter中contains 用法的主要内容,如果未能解决你的问题,请参考以下文章
django model 条件过滤 queryset.filter(**condtions) 用法