zoukankan      html  css  js  c++  java
  • django初步了解4

    django单表查询

    必知必会13条

    1.all() 查询所有 QuerySet

    res=models.Book.objects.all()#惰性查询
    print(res)
    for i in res:
    	print(i.title)
    

    2.filter() 查询指定范围 QuerySet

    res=models.Book.objects.filter(pk=3)
    print(res)
    

    3.get() 查询单个对象,若有多个数据会报错,不建议使用

    res=models.Book.objects.get(pk=2)
    print(res.title)
    

    4.first() 拿第一个

    res=models.Book.objects.filter(pk=2).first()
    print(res)
    

    5.last() 拿最后一个

    res=models.Book.objects.filter(pk=1).last()
    print(res)
    

    6.exclude() 除此之外 QuerySet

    res = models.Book.objects.exclude(pk=3).filter(pk=4).filter(pk=4)
    print(res)
    

    7.values() 查出所有的title以列表套字典形式 QuerySet

    res=models.Book.objects.values('title')
    print(res)
    for r in res:
        print(r.get('title'))
    

    8.values_list() QuerySet 同上列表套元组

    res = models.Book.objects.values_list('title')
    print(res)
    

    9.count() 统计个数

    res=models=Book.objects.all().count()
    print(res)
    
    

    10.distinct() 去重(必须是数据全一样才能去重,包括主键)

    res=models.Book.objects.all().distinct()
    res1=models.Book.objects.values('title').distinct()
    print(res,res1)
    
    

    11.order_by() 排序默认升序

    res=models.Book.objects.order_by('price')
    #res=models.Book.objects.order_by('-price')#倒序的一种方式
    print(res)
    
    

    12.reverse() 必须是已经排序好的才可以反转

    res=models.Book.objects.order_by('price').reverse()
    print(res)
    
    

    13.exists() 是否为空,返回布尔值

    res=modles.Book.objects.all().exists()
    print(res)
    
    

    双下划线查询来咯

    查询价格大于200的书籍

    res=models.Book.objects.filter(price__gt=200)
    
    

    查询价格小于200的书籍

    res = models.Book.objects.filter(price__lt=200)
    
    

    查询价格大于或者等于200的书籍

    res = models.Book.objects.filter(price__gte=200)
    
    

    价格是200或者123.23或者666.66的

    res = models.Book.objects.filter(price__in=[200,123.23,666.66])
    
    

    价格在200到700之间的

    res = models.Book.objects.filter(price__range=(200,700))
    
    

    模糊匹配

    like % _

    查询书籍名称中包含p的

    res =models.Book.objects.filter(title__contains='p')#区分大小写
    res =models.Book.objects.filter(title__icontains='p')#不分大小写
    
    

    查询以三开头的书籍

    res = models.Book.objects.filter(title__startswith='三')
    res1 = models.Book.objects.filter(title__endswith='P')
    print(res1)
    
    

    查询某年某月的书籍

    res = models.Book.objects.filter(publish_date__year='2019')
    res = models.Book.objects.filter(publish_date__month='10')
    
    

    多表操作

    一对多增删改查

    #传publish_id时传id值
    models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)
    #若传publish则传publish对象
    publish_obj=models.Book.objects.filter(pk=1).first()
    models.Book.objects.create(title='三国演义',price=123.23,publish=publish_obj)
    
    

    book_obj = models.Book.objects.filter(pk=1).first()
    print(book_obj.publish)  # 获取到当前所对应的出版社对象
    print(book_obj.publish_id)  # 获取到的就是表中的实际字段
    
    

    models.Book.objects.filter(pk=1).update(publish_id=3)
    publish_obj = models.Publish.objects.filter(pk=2).first()
    models.Book.objects.filter(pk=1).update(publish=publish_obj)
    
    

    models.Publish.objects.filter(pk=2).delete()
    默认也是级联更新 级联删除
    
    

    多对多增删改查(操作的都是第三张表)

    增add

    book_obj=models.Book.objects.filter(pk=3).first()
    print(book_obj.authors)
    book_obj.authors.add(1,2)
    
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.add(author_obj)
    book_obj.authors.add(author_obj,author_obj1)
        """
        add() 括号内既可以传数字也可以传数据对象
        并且都支持传多个
        """
    
    

    改set

    book_obj = models.Book.objects.filter(pk=3).first()
    # book_obj.authors.set([3,])
    # book_obj.authors.set([1,3])
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    book_obj.authors.set((author_obj,))
    book_obj.authors.set((author_obj,author_obj1))
        """
        set() 括号内 既可以传数字也传对象 
        并且也是支持传多个的
        但是需要注意 括号内必须是一个可迭代对象
        """
    
    

    删remover

    book_obj = models.Book.objects.filter(pk=3).first()
    # book_obj.authors.remove(2)
    # book_obj.authors.remove(1,2)
    
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.remove(author_obj)
    book_obj.authors.remove(author_obj,author_obj1)
    """
        remove() 括号内 既可以传数字也传对象 
        并且也是支持传多个的
    """
    
    

    清空clear

    book_obj = models.Book.objects.filter(pk=3).first()
    book_obj.authors.clear()
    """clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""
    
    

    跨表查询

    """
    ORM跨表查询
        1.子查询
        2.连表查询
        
    正反向的概念
        外键字段在谁那儿 由谁查谁就是正向
        
        谁手里有外键字段 谁就是正向查
        没有外键字段的就是反向
        书籍对象 查  出版社    外键字段在书籍       正向查询
        出版社 查 书籍         外键字段在书籍       反向查询
        
        
        正向查询按字段
        反向查询按表名小写 ...
        
    """
    
    
    """
    # 1.基于对象的跨表查询    子查询
    # 1.查询书籍是python入门的出版社名称
    book_obj = models.Book.objects.filter(title='python入门').first()
    # 正向查询按字段
    print(book_obj.publish.name)
    print(book_obj.publish.addr)
    # 2.查询书籍主键是6的作者姓名
    book_obj = models.Book.objects.filter(pk=6).first()
    # print(book_obj.authors)  # app01.Author.None
    print(book_obj.authors.all())
    # 3.查询作者是jason的手机号
    author_obj = models.Author.objects.filter(name='jason').first()
    print(author_obj.author_detail.phone)
    print(author_obj.author_detail.addr)
    """
    正向查询 按字段 
    当该字段所对应的数据有多个的时候 需要加.all()
    否者点外键字段直接就能够拿到数据对象
    """
    # 4.查询出版社是东方出版社出版过的书籍
    publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    # print(publish_obj.book_set)  # app01.Book.None
    print(publish_obj.book_set.all())
    # 5.查询作者是jason写过的所有的书
    author_obj = models.Author.objects.filter(name='jason').first()
    # print(author_obj.book_set)  # app01.Book.None
    print(author_obj.book_set.all())
    # 6.查询手机号是110的作者
    author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    print(author_detail_obj.author)
    print(author_detail_obj.author.name)
    print(author_detail_obj.author.age)
    """
    反向查询按表名小写 
        什么时候需要加_set
            当查询的结果可以是多个的情况下 需要加_set.all()
        什么时候不需要加_set
            当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
    """
    # 7.查询书籍是python入门的作者的手机号
    book_obj = models.Book.objects.filter(title='python入门').first()
    print(book_obj.authors.all())
    
  • 相关阅读:
    [转]PostgreSQL 逻辑结构 和 权限体系 介绍
    [转]常见的动态规划问题分析与求解
    [转]如何在Windows 10中更改文件夹背景颜色
    []如何在Windows 10中更改文件夹背景颜色
    [转]Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
    [转]使用自定义HttpMessageConverter对返回内容进行加密
    php+redis实现消息队列
    利用redis List队列简单实现秒杀 PHP代码实现
    redis 缓存击穿 看一篇成高手系列3
    redis 延时任务 看一篇成高手系列2
  • 原文地址:https://www.cnblogs.com/leaf-wind/p/11755595.html
Copyright © 2011-2022 走看看