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

相關文章
相關標籤/搜索