django全栈(六):QuerySet概要

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/junbujianwpl/article/details/89810494

数据库里的数据要展示出来,查询筛选必不可少。复杂一点的可能会让刚接触的人抓狂。

官方文档:https://docs.djangoproject.com/zh-hans/2.1/ref/models/querysets

 

入门级-filter:

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。

 

进阶

1、Q、F

filter只能表示与的关系,如果要表示或、非,此时需要用到Q表达式(对象)。

Friend.objects.filter( ~Q(name="xx") | Q(height__lt=160) )

 

如果查询同一个实例多个参数之间的关系,需要用到F表达式(对象)。

查询某个月薪大于年龄的同事。

Fellow.objects.filter(salary__gt=F("age"))

 

2、Union、intersection、difference

多个查询集的并、交、差。

A.union(B) = A \cup B,    A.intersection(b)=A\cap B,A.defference(B)=A-A\cap B

均可带多个参数,即A.difference(B,C,D)

 

3、aggregate、annotate

聚合与注解。

聚合是一组方便的数据统计工具,比如求均值、方差、标准差、最大、最小等。

注解是给实例添加一个新的属性,新增的属性往往来自于聚合,当然也可以是手动添加的属性。

 

4、执行sql语句

前面的所有方法均无法满足复杂的需求时,那就直接上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/

 

展开阅读全文

没有更多推荐了,返回首页