以一個學生類爲例: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的值