zoukankan      html  css  js  c++  java
  • Django 查询集简述

    通过模型中的管理器构造一个查询集(QuerySet),来从数据库中获取对象。查询集表示从数据库中取出来的对象的集合。它可以含有零个、一个或者多个过滤器。过滤器基于所给的参数限制查询的结果。 从SQL 的角度,查询集SELECT语句等价,过滤器是像WHERE 和LIMIT 一样的限制子句。

    可以从模型的管理器那里取得查询集每个模型都至少有一个管理器,它默认命名为objects通过模型类来直接访问它,像这样:

    >>> Blog.objects
    <django.db.models.manager.Manager object at ...>
    >>> b = Blog(name='Foo', tagline='Bar')
    >>> b.objects
    Traceback:
        ...
    AttributeError: "Manager isn't accessible via Blog instances."

    管理器只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作。

     

    查询集方法:

    对于一个模型来说,管理器是查询集的主要来源例如,Blog.objects.all() 返回包含数据库中所有Blog 对象的一个查询集。但往往我们需要进行筛选,all()不足以满足需求。所以需要在原始的查询集上增加一些过滤条件,常见的有

    • all():返回包含数据库表中所有记录的查询集,支持切片: Entry.objects.all()[5:10]
    • filter(**kwargs): 返回一个新的查询集,它包含满足查询参数的对象。  eg: Entry.objects.filter(pub_date__year=2006)
    • exclude(**kwargs):返回一个新的查询集,它包含不满足查询参数的对象。 eg: Entry.objects.filter(pub_date__year=2006).exclude.(pub_date__gte=datetime.date.today())    链式
    • get()方法:返回满足要求的一个对象,使用get()和filter()切片[0]的方法有点区别,如果不满足查询要求则get()将引发DoesNotExit异常。类似的,如有多条记录满足查询条件则也报错。
    one_entry = Entry.objects.get(pk=1)   # 查询主键为1的记录,如没有主键为1的Entry对象,则引发Entry.DoesNotExit

    除all(),filter()...外,还有很多查询集方法,可在官方文档查询集API参考查阅。

    查询集方法的参数:

    字段查询通过查询集方法filter()...的关键字参数来指定。查询的关键字参数的基本形式为field__lookuptype=value(字段名后有两个下划线!)

    Entry.objects.filter(pub_date__lte='2006-01-01')
    Entry.objects.filter(blog_id=4) #特别的,对于ForeignKey可以用字段名加上_id后缀,此时参数的值为外键的原始值
    Entry.objects.get(headline__exact="Man bites dog")  # exact表示精确匹配,若你只提供字段名headline,则默认为exact,即等价于Entry.objects.get(headline="Man bites dog")
    Blog.objects.get(name__iexact="beatles blog")  # iexact表示大小写不敏感匹配  "Beatles Blog""beatles blog"都会被匹配上。
    Entry.objects.get(headline__contains='Lennon')  # contains为大小写敏感的包含关系测试 注意,这将匹配'Today Lennon honored' 但不能匹配'today lennon honored'

    看完上面的例子,此外还有icontains表示大小写不敏感包含关系,startswith 和 endswith分别为以XXX和XXX开头结尾,当然大小写不敏感版本istartswith,iendswith。

    查询的快捷方式pk:

    为了方便,Django 提供一个查询快捷方式pk ,它表示“primary key” 的意思。eg:在Blog模型中主键为id字段,所以以下三条语句等价。

    Blog.objects.get(id__exact=14) # Explicit form
    Blog.objects.get(id=14) # __exact is implied
    Blog.objects.get(pk=14) # pk implies id__exact

    pk 的使用不仅限于__exact 查询 —— 任何查询类型都可以与pk 结合来完成一个模型上对主键的查询:

    # Get blogs entries with id 1, 4 and 7
    >>> Blog.objects.filter(pk__in=[1,4,7])
    
    # Get all blog entries with id > 14
    >>> Blog.objects.filter(pk__gt=14)

    参考:官方文档查询

               官方文档查询集

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/king-lps/p/7327647.html
Copyright © 2011-2022 走看看