以一个学生类为例:
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的值