• 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)

    参考:官方文档查询

               官方文档查询集

  • 相关阅读:
    zoj1942Frogger
    阿里云api调用做简单的cmdb
    约瑟夫环
    Bag标签之中的一个行代码实行中文分词实例3
    用lua扩展你的Nginx(整理)
    Single Number III
    TCP/IP ---分层
    TCP/IP --概述
    adb命令学习
    How to set Selenium Python WebDriver default timeout?
  • 原文地址:https://www.cnblogs.com/king-lps/p/7327647.html
Copyright © 2020-2023  润新知