数据库里的数据要展示出来,查询筛选必不可少。复杂一点的可能会让刚接触的人抓狂。
官方文档:https://docs.djangoproject.com/zh-hans/2.1/ref/models/querysets
Friend.objects.filter(gender="female",height__gt=165,name__contains="芳",age__in=[25,28,36],span__range=(1,3)).order_by("-height")
与的关系,查找性别女且身高大于165且名字中包含芳且年龄在[25,28,36]中且认识年限在[1,3)之间的所有人并按身高降序排序。
其余的还有iexact、istartswith、endswith等等。i表示case insensitive。
filter只能表示与的关系,如果要表示或、非,此时需要用到Q表达式(对象)。
Friend.objects.filter( ~Q(name="xx") | Q(height__lt=160) )
如果查询同一个实例多个参数之间的关系,需要用到F表达式(对象)。
查询某个月薪大于年龄的同事。
Fellow.objects.filter(salary__gt=F("age"))
多个查询集的并、交、差。
A.union(B) = , A.intersection(b)=,A.defference(B)=
均可带多个参数,即A.difference(B,C,D)
聚合与注解。
聚合是一组方便的数据统计工具,比如求均值、方差、标准差、最大、最小等。
注解是给实例添加一个新的属性,新增的属性往往来自于聚合,当然也可以是手动添加的属性。
前面的所有方法均无法满足复杂的需求时,那就直接上sql语句吧。
2个层次,只查当前model对应的表,查整个数据库。
Student.objects.raw("select * from myapp_student where score>90")
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
不要用字符串格式化"name={}".format(someone)之类的,会有sql注入的风险。用django自带的参数传递机制。
参考此链接
https://docs.djangoproject.com/zh-hans/2.1/topics/db/sql/