• 模型层中QuerySet的学习


    创建对象

    使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中

    pub_obj = models.Publisher(title='奥利给出版社')
    pub_obj.save()  //该方法没有返回值
    

    上面的代码在背后执行了SQL 的Insert语句。 在你显式调用save()之前,Django 不会访问数据库。

    如果你想只用一条语句创建并保存一个对象,使用create()方法。

    将更改保存到对象

    要保存对数据库中已存在的对象的改动,请使用save()。

    假设Publisher的一个实例pub_obj已经被保存在数据库中,下面这个例子将更改它的name并且更新数据库中的记录:

    >>> pub_obj.name = '哈麻皮出版社'
    >>> pub_obj.save()
    

    上面的代码在背后执行SQL 的UPDATE语句。 在你显式调用save()之前,Django 不会访问数据库。

    链式过滤器

    QuerySet的筛选结果本身还是QuerySet,所以可以将筛选语句链接在一起

    models.Author.objects.filter(xxx).exclude(xxx)
    

    限制QuerySet

    可以使用Python 的切片语法来限制QuerySet记录的数目 。 它等同于SQL 的OFFSET 和LIMIT子句。

    例如,下面的语句返回前面5 个对象(LIMIT 5):

    >>> Author.objects.all()[:5]
    

    下面这条语句返回第6 至第10 个对象(OFFSET 5 LIMIT 5):

    >>> Author.objects.all()[5:10]
    

    不支持负的索引(例如Author.objects.all()[-1])。

    字段查找

    常用字段

    __lte  //小于等于
    __lt  //小于
    _id //查找外键id为xxx的对象
    __exact  //精准匹配 如果你没有提供查询类型 —— 即如果你的关键字参数不包含双下划线 —— 默认假定查询类型是exact。iexact 忽略大小写
    
    __contains //包含  icontains忽略大小写
    __in  //在给定的列表里
    __startswith //以什么开头  istartswith不区分大小写
    __endswith  //以什么结尾  iendswith不区分大小写
    __range   //范围测试(包含于之中)
    __isnull  //值为 False 或 True, 相当于 SQL语句IS NULL和IS NOT NULL.
    

    跨表查询

    Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理join。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

    >>> Blog.objects.filter(entry__headline='Lennon')
    

    注:__表示跨一张表

    关联对象

    正向查询

    >>> e = Entry.objects.get(id=2)
    >>> e.blog # 返回blog关系管理对象
    >>> e.blog.all # 返回blogQuerySet
    

    反向查询

    如果模型有一个ForeignKey,那么该ForeignKey所指的模型实例可以通过一个Manager返回第一个模型的所有实例。 默认情况下,这个Manager的名字为FOO_set,其中FOO是源模型的小写名称。 该Manager返回QuerySets,可以用上一节提到的方式进行过滤和操作。

    例如:

    >>> b = Blog.objects.get(id=1)
    >>> b.entry_set.all() # Returns all Entry objects related to Blog.
    
    # b.entry_set is a Manager that returns QuerySets.
    >>> b.entry_set.filter(headline__contains='Lennon')
    >>> b.entry_set.count()
    

    你可以在ForeignKey定义时设置related_name参数来覆盖FOO_set 的名称。 例如,如果Entry模型更改为blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'),上述示例代码如下所示:

    >>> b = Blog.objects.get(id=1)
    >>> b.entries.all() # Returns all Entry objects related to Blog.
    
    # b.entries is a Manager that returns QuerySets.
    >>> b.entries.filter(headline__contains='Lennon')
    >>> b.entries.count()
    

    处理关系管理对象的其他方法

    add(obj1, obj2, ...)
    

    添加一指定的模型对象到关联的对象集中。

    create(**kwargs)
    

    创建一个新的对象,将它保存并放在关联的对象集中。 返回新创建的对象。

    remove(obj1, obj2, ...)
    

    从关联的对象集中删除指定的模型对象。

    clear()
    

    从关联的对象集中删除所有的对象。

    set(objs)
    

    替换相关对象集。

    ORM常见操作

    filter  //返回一个新的QuerySet,它包含满足查询参数的对象
    exclude  //返回一个新的QuerySet,它包含不满足给定的查找参数的对象
    order_by //排序,-号为降序,默认升序
    reverse //反转
    distinct  //去重
    values  //返回QuerySet,里面包含字典对象
    values_list // 返回QuerySet,里面包含元组
    count  //返回个数
    exists //判断是否存在
    first //返回第一个对象
    last  //返回最后一个对象
    delete //删除
    

    Q

    在filter()中的关键字参数查询 — 是“AND”的关系。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q对象。

    Q(question__startswith='Who') | Q(question__startswith='What') //|取或  
    ~Q(pub_date__year=2005)  // ~取反
    

    F

    一个 F()对象代表了一个model的字段值或注释列。 使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。

    相反,Django使用F()对象生成描述数据库级所需操作的SQL表达式。

    from django.db.models import F
    
    reporter = Reporters.objects.get(name='Tintin')
    reporter.stories_filed = F('stories_filed') + 1
    reporter.save()
    

    F()表达式的效率上的优点主要体现在

    • 直接通过数据库操作而不是Python
    • 减少数据库查询次数
  • 相关阅读:
    HDU3480-Division-斜率dp
    CDQ题目套路总结 [未完成]
    HDU5773-The All-purpose Zero-多校#41010-最长上升子序列问题
    POJ2763-Housewife Wind-树上单点修改区间求和
    HDU3507-Print Article-斜率dp入门题
    POJ2187-Beauty Contest-凸包
    SPOJ QTREE-Query on a tree-树链剖分-边权
    扫描系统进程和获取某进程的PID
    ConfuserEx壳
    关于Intel漏洞的学习
  • 原文地址:https://www.cnblogs.com/williamweson/p/13040675.html
Copyright © 2020-2023  润新知