博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django的各种查询
阅读量:5987 次
发布时间:2019-06-20

本文共 2214 字,大约阅读时间需要 7 分钟。

hot3.png

以一个学生类为例:

class Student(models.Model):

     id= models.FloatField(primary_key=True,related_name='blog')

     name= models.CharField(max_length=20, blank=True, null=True)
     age=models.FloatField(blank=True, null=True) 

     class Meta:

        managed = False
        db_table = 'student'

class Blog(models.Model):

    name = models.CharField(max_length=100)

    tagline = models.TextField()

    student=models.ForeignKey(Student)

1.基础查询:

 Student.objects.all();查询全部(Object是你要查的表对应的model名,后面是Django语法)

相当于 " select * from  student"

 Object.objects.filter(过滤条件);filter里面的内容相当于sql语句where后面的过滤条件,多个过滤条件用逗号隔开,相当于sql中的'and'

     过滤条件有:=  等值过滤     eg:id=1 

                         select ......... where id=1 

                         __lt  小于(双下划线,下同)    eg: age__lt='18

                          __lte 小于等于

                          __gt 大于

                          __gte 大于等于

                          __in  相当于sql语句的in eg: id__in=id_list(id列表)

                          __contains 模糊查询 相当于 like ‘%abc%’ 

                          __iexact 精确等于 忽略大小写 ilike ‘abc’

不等于(或not in):

如果要查询某个字段的值不等于某值或者是not in,Django提供了exclude(汉译:排除)方法

eg:查询id!=1的数据 ——Student.objects.all().execute(id=1)

      select ........ where id!=1        

查询id not in(1,2,3,4)——id_list=[1,2,3,4] Student.objects.all().execute(id__in=id_list)

     select ........ where id not in(1,2,3,4)

排序:

django提供了order_by来指定字段给查询结果排序(默认是升序)

eg: Student.objects.all().order_by('id')

       select * from student order by id asc

降序排列:order_by('-id')

查询某几个字段:

eg:Student.objects.values('id','name','age').order_by('id')

 select id,name,age from student order by id

通过values()方法查询到的结果集是一个QuerySet,里面存的是字典,而查询全部字段得到结果集是QuerySet里面存的是一个个object对象。

or查询:

from django.db.models import Q

eg:查询id是1或age<18的学生:

Student.objects.filter(Q(age__lt=18)|Q(id=1))

分页查询(相当于limit):   不支持负索引

Student.objects.all()[:5] 查询前5行数据

Student.objects.all()[5:10] 查询6到10行数据

2.聚合查询(count/avg/max/min/sum等)

使用django提供的aggregate(聚合函数)

eg:查询学生数:

from django.db.models import Count

Student.objects.all().aggregate(num=Count('id')) 指定列名为num

分组查询:

 Student.objects.filter('age').annotate(Count('id'))

3.多表查询

通过外键查询关联对象:

       b = Blog.objects.get(id=2)

      b.student()

过滤字段为关联表字段时用"__"双下划线(两个下划线可以生成连接查询,查询关联的字段信息):

    b=Blog.objects.filter(student__age>18)

查询字段也可以是关联表字段:

    b=Blog.objects.filter(student__age>18).values('name','student__name')

    查询结果为学生名字和博客名字

反向查询 (主键类访问外键类):

 

    s = Student.objects.get(id=1)

    s.blog.all()  #这么查询,必须在外键里面加上related_name属性,blog为related_name的值

转载于:https://my.oschina.net/u/3420568/blog/1605547

你可能感兴趣的文章
Python2.7 smtplib发送带附件邮件报错STARTTLS解决方法
查看>>
活动目录的优势
查看>>
《3D数学基础》1.8 混合积
查看>>
拍照之外, 游戏手机会成为手机新品类吗?
查看>>
Lync 小技巧-1-解决搜索不到联系人的方法
查看>>
数据仓库入门(实验6)添加层次结构
查看>>
第一次获得Microsoft MVP应该做的事
查看>>
用OSSIM发现网络扫描
查看>>
IT群侠传第四回大鱼小虾
查看>>
10分钟搭建Kubernetes容器集群平台(kubeadm)
查看>>
邀小黄人代言,vivo的国际化启示
查看>>
我的家庭私有云计划-18
查看>>
当我们谈论知识管理时,我们在谈论什么?
查看>>
我是这样看搜狗搜索与知乎合作的
查看>>
演示:为思科29系列的交换机升级IOS镜像
查看>>
统一沟通-技巧-4-让国内域名提供商“提供”SRV记录
查看>>
一次DPM备份Exchange DAG的故障处理过程
查看>>
Windows Server 2012 NIC Teaming配置实战
查看>>
KingbaseES的HA搭建
查看>>
思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系
查看>>