django的各类查询

以一个学生类为例:sql

class Student(models.Model):django

     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'spa

class Blog(models.Model):对象

    name = models.CharField(max_length=100)blog

    tagline = models.TextField()排序

    student=models.ForeignKey(Student)索引

1.基础查询:get

 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的值

相关文章
相关标签/搜索