• Django如何进行数据访问查询


    查询集合

    Django 模型通过默认的 Manager objects 来访问数据库。例如,要打印所有 Job 的列表,则应该使用 objects 管理器的 all 方法:

    清单 11. 打印所有的职位

    >>> from jobs.models import Job

    >>> for job in Job.objects.all():

    ...     print job

      

    Manager 类还有两个过滤方法:一个是 filter,另外一个是 exclude。过滤方法可以接受满足某个条件的所有方法,但是排除不满足这个条件的其他方法。下面的查询应该可以给出相同的结果(“gte 表示 “大于或等于”,而 lt 表示 “小于”)。

    清单 12. 排除和过滤职位

    >>> from jobs.models import Job

    >>> from datetime import datetime

    >>> q1 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))

    >>> q2 = Job.objects.exclude(pub_date__lt=datetime(2006, 1, 1))

          

    filter exclude 方法返回一些 QuerySet 对象,这些对象可以链接在一起,甚至可以执行连接操作。下面的 q4 查询会查找从 2006 1 1 日开始在俄亥俄州的 Cleveland 张贴的职位:

    清单 13. 对职位进行更多的排除和过滤

    >>> from jobs.models import Job

    >>> from datetime import datetime

    >>> q3 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))

    >>> q4 = q3.filter(location__city__exact="Cleveland",

    ...                location__state__exact="Ohio")

          

    这种惰性利用了 Python 的分片(slicing)功能。下面的代码并没有先请求所有的记录,然后对所需要的记录进行分片,而是在实际的查询中使用了 5 作为 OFFSET10 作为 LIMIT,这可以极大地提高性能。

    清单 14. Python 分片

    >>> from jobs.models import Job

    >>> for job in Job.objects.all()[5:15]

    ...     print job

          

    注意:使用 count 方法可以确定一个 QuerySet 中有多少记录。Python len 方法会进行全面的计算,然后统计那些以记录形式返回的行数,而 count 方法执行的则是真正的 SQL COUNT 操作,其速度更快。我们这样做,数据库管理员会感激我们的。

    清单 15. 统计记录数

    >>> from jobs.models import Job

    >>> print "Count = ", Job.objects.count()       # GOOD!

    >>> print "Count = ", len(Job.objects.all())    # BAD!

          

  • 相关阅读:
    当你发现前端传过来的空格是 xa0
    反转义——使从文件读取的失效的转义字符串生效
    openpyxl 读取前端传输的文件,并处理
    django实现下载excel
    IO模块的使用
    pandas 执行sql语句
    近期工作生活小总结
    入职一个月++近期学习++生活总结
    github访问不了
    实现Spring框架(二) SpringMVC框架
  • 原文地址:https://www.cnblogs.com/yaksea/p/2158395.html
Copyright © 2020-2023  润新知