zoukankan      html  css  js  c++  java
  • [py]django强悍的数据库接口(QuerySet API)-增删改查

    django强悍的数据库接口(QuerySet API)

    • 4种方法插入数据
    • 获取某个对象
    • filter过滤符合条件的对象
    • filter过滤排除某条件的对象- 支持链式多重查询

    没找到排序的

    - 4种方法插入数据
    1.
        Person.obejct.create(name="maotai",age = 22)
    
    2.
        p = Person(name = "percona", age = 28)
        p.save()
    
    3.
        p = Person()
        p.name = "tutu"
        p.age = 21
        p.save()
    
    
    4.不存在则创建,存在则获取
        Person.objects.get_or_create(name='percona',age = 29)
    
    
    
    - 获取某个对象
      - 获取所有                Person.objects.all()
      - 获取前10个,切片操作,    Person.objects.all()[:10]
      - 指定某字段:             Person.objects.get(name=name)
    
    
    - filter过滤符合条件的对象
      - name严格等于maotai的,            Person.objects.filter(name="maotai") 或
                                         Person.objects.filter(name__exact="maotai")
      - name等于maotai的,含大小写        Person.objects.filter(name__iexact="maotai")  
      - name包含abc的人                  Person.objects.filter(name__contains="abc")
      - name包含abc的人,含大小写         Person.objects.filter(name__icontains="abc")
      - 正则匹配                         Person.objects.filter(name__regex="^abc")
      - 正则匹配,含大小写                Person.objects.filter(name__iregex="^abc")
    
      
    - filter过滤排除某条件的对象- 支持链式多重查询
      - 排除包含maotai的Person对象              Person.objects.exclude(name__contains="maotai") 
      - 找出名称含有abc, 但是排除年龄是23岁的   Person.objects.filter(name__contains="abc").exclude(age=23)
    
    

    QuerySet 增删改查

    数据库查询出来的结果是QuerySet,可按照list方法来操作

    1.QuerySet 创建对象的方法

    >>> from blog.models import Blog
    >>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
    >>> b.save()
     
    总之,一共有四种方法
    # 方法 1
    Author.objects.create(name="maotai", email="maotai@163.com")
     
    # 方法 2
    twz = Author(name="maotai", email="maotai@163.com")
    twz.save()
     
    # 方法 3
    twz = Author()
    twz.name="maotai"
    twz.email="maotai@163.com"
    twz.save()
     
    # 方法 4,首先尝试获取,不存在就创建,可以防止重复
    Author.objects.get_or_create(name="maotai", email="maotai@163.com")
    # 返回值(object, True/False)
    

    备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False

    当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

    >>> from blog.models import Entry
    >>> entry = Entry.objects.get(pk=1)
    >>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
    >>> entry.blog = cheese_blog
    >>> entry.save()
    

    2.获取对象的方法(上一篇的部分代码)

    Person.objects.all() # 查询所有
    Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条
    Person.objects.get(name="maotai") # 名称为 maotai 的一条,多条会报错
     
    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
    Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
    Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
     
    Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
    Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
     
    Person.objects.filter(name__regex="^abc") # 正则表达式查询
    Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
     
    # filter是找出满足条件的,当然也有排除符合某条件的
    Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
    Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
    

    3.删除符合条件的结果

    Person.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人
     
    如果写成 
    people = Person.objects.filter(name__contains="abc")
    people.delete()
    效果也是一样的,Django实际只执行一条 SQL 语句。
    

    4.更新某个内容

    (1) 批量更新,适用于 .all()  .filter()  .exclude() 等后面 (危险操作,正式场合操作务必谨慎)
    
    Person.objects.filter(name__contains="abc").update(name='xxx') # 名称中包含 "abc"的人 都改成 xxx
    Person.objects.all().delete() # 删除所有 Person 记录
    
    (2) 单个 object 更新,适合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很类似。
    twz = Author.objects.get(name="maotai")
    twz.name="maotai"
    twz.email="maotai@163.com"
    twz.save()  # 最后不要忘了保存!!!
    

    5.QuerySet 是可迭代的

    es = Entry.objects.all()
    for e in es:
        print(e.headline)
    

    注意事项:

    - (1). 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists()
    - (2). QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存
    - (3). 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)
    - (4). list(es) 可以强行将 QuerySet 变成 列表
    

    6. QuerySet 是可以用pickle序列化到硬盘再读取出来的

    >>> import pickle
    >>> query = pickle.loads(s)     # Assuming 's' is the pickled string.
    >>> qs = MyModel.objects.all()
    >>> qs.query = query            # Restore the original 'query'.
    

    7. QuerySet 查询结果排序

    Author.objects.all().order_by('name')
    Author.objects.all().order_by('-name') # 在 column name 前加一个负号,可以实现倒序
    

    8. QuerySet 支持链式查询

    Author.objects.filter(name__contains="maotai").filter(email="maotai@163.com")
    Author.objects.filter(name__contains="Wei").exclude(email="maotai@163.com")
     
    # 找出名称含有abc, 但是排除年龄是23岁的
    Person.objects.filter(name__contains="abc").exclude(age=23)
    

    9. QuerySet 不支持负索引

    Person.objects.all()[:10] 切片操作,前10条
    Person.objects.all()[-10:] 会报错!!!
     
    # 1. 使用 reverse() 解决
    Person.objects.all().reverse()[:2] # 最后两条
    Person.objects.all().reverse()[0] # 最后一条
     
    # 2. 使用 order_by,在栏目名(column name)前加一个负号
    Author.objects.order_by('-id')[:20] # id最大的20条
    

    10. QuerySet 重复的问题,使用 .distinct() 去重

    一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可能会出来重复的值(我最近就遇到过这样的问题)

    qs1 = Pathway.objects.filter(label__name='x')
    qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
    qs3 = Pathway.objects.filter(inputer__name='maotai')
     
    # 合并到一起
    qs = qs1 | qs2 | qs3
    这个时候就有可能出现重复的
     
    # 去重方法
    qs = qs.distinct()
    
  • 相关阅读:
    C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
    opencv中的vs框架中的Blob Tracking Tests的中文注释。
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/8336484.html
Copyright © 2011-2022 走看看