码迷,mamicode.com
首页 > 其他好文 > 详细

9.19总结

时间:2019-09-19 22:10:39      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:span   exist   没有   res   价格   query   迭代   ble   level   

模型层

  十三个方法

    all()    查询所有结果

    filter()    它包含了与所有给筛选条件相匹配的对象    

    get()    返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有,都会抛出错误

    exclude()    它包含了与所给筛选条件不匹配的对象

    order_by()    对查询结果排序

    reverse()    对查询结果反向排序,前面要先有排序才能反向

    values()    返回一个ValuesQuerySet  一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

    values_list()     它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典劽

    count()    返回数据库中匹配查询(QuerySet)的对象数量

    exists()    如果QuerySet包含数据,就返回True,否则返回False

    first()    返回第一条记录

    last()    返回最后一条记录

    distinct()     从返回结果中剔除重复记录

  双下滑查询

    """

    查看orm内部sql语句的方法有哪些

      1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句

      2.在django项目的配置文件中,配置一下参数即可实现所有的orm在查询的时候自动打印对应的sql语句

      LOGGING = {

        ‘version‘: 1,

        ‘disable_existing_loggers‘: False,

        ‘handlers‘: {

          ‘console‘: {

            ‘level‘: ‘DEBUG‘,

            ‘class‘: ‘logging.StreamHandler‘,

          },

        },

        ‘loggersd‘: {

          ‘django.db.backends‘: {

            ‘handlers‘: [‘console‘],

            ‘propagate‘: True,

            ‘level‘: ‘DEBUG‘,

          },

        }

      }

    """

        # 查询价格大于200的书籍
        # res = models.Book.objects.filter(price__gt=200)
        # print(res)
        # 查询价格小于200的书籍
        # res = models.Book.objects.filter(price__lt=200)
        # print(res)

        # 查询价格大于等于200.22的书籍
        # res = models.Book.objects.filter(price__gte=200.22)
        # print(res)
        # 查询价格小于等于200.22的书籍
        # res = models.Book.objects.filter(price__lte=200.22)
        # print(res)


        # 查询价格要么是200,要么是300,要么是666.66
        # res = models.Book.objects.filter(price__in=[200,300,666.66])
        # print(res)
        # 查询价格在200到800之间的
        # res = models.Book.objects.filter(price__range=(200,800))  # 两边都包含
        # print(res)

        # 查询书籍名字中包含p的
        """原生sql语句 模糊匹配
            like 
                %
                _
        """
        # res = models.Book.objects.filter(title__contains=‘p‘)  # 仅仅只能拿小写p
        # res = models.Book.objects.filter(title__icontains=‘p‘)  # 忽略大小写

        # print(res)


        # 查询书籍是以三开头的
        # res = models.Book.objects.filter(title__startswith=‘三‘)
        # res1 = models.Book.objects.filter(title__endswith=‘p‘)
        # print(res)
        # print(res1)
            
        
        # 查询出版日期是2017的年(******)
        res = models.Book.objects.filter(create_time__year=2017)
        print(res)

  

多表操作

  图书管理系统表创建

    一对多:ForeignKey

    一对一:OneToOneField   可以同ForeignKey代替ForeignKey(unique=True)

    上面两个关键字创建出来的字段会自动面上 _id 后缀

    多对多:ManyToManyField

    该字段并不会真正的在表中展示出来,它仅仅是一个虚拟字段

      1.告诉orm自动创建第三种表

      2.帮助orm跨表查询

  

  一对多字段的增删改查

#
    # publish_id传数字
    # models.Book.objects.create(title=‘三国演义‘,price=189.99,publish_id=1)
    #  publish直接传出版社对象
    # publish_obj = models.Publish.objects.filter(pk=2).first()
    # models.Book.objects.create(title=‘红楼梦‘,price=999.99,publish=publish_obj)

    #
    # 传数字的
    # 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()  # 默认都是级联更新 级联删除

 

  多对多字段的增删改查

#
    # 要给主键为1的书籍添加两个作者
    # book_obj = models.Book.objects.filter(pk=1).first()
    # print(book_obj.authors)  # 对象点击多对多虚拟字段 会直接跨到多对多的第三张表
    # book_obj.authors.add(1)
    # book_obj.authors.add(2,3)

    # author_obj = models.Author.objects.filter(pk=1).first()
    # author_obj1 = models.Author.objects.filter(pk=2).first()
    # author_obj2 = models.Author.objects.filter(pk=3).first()
    # book_obj.authors.add(author_obj)
    # book_obj.authors.add(author_obj1,author_obj2)
    """
    add()
    是给书籍添加作者  括号内既可以传数字也可以传对象
    并且支持一次性传多个  逗号隔开即可
    """

    #
    # 将主键为1的书籍对象 作者修改为2,3
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.set([2,])
    # book_obj.authors.set([2,3])

    # author_obj = models.Author.objects.filter(pk=1).first()
    # author_obj1 = models.Author.objects.filter(pk=2).first()
    # author_obj2 = models.Author.objects.filter(pk=3).first()
    # book_obj.authors.set([author_obj,])
    # book_obj.authors.set([author_obj, author_obj1, author_obj2])
    """
    set()括号内 需要传一个可迭代对象 
    可迭代对象中 可以是多个数字组合
    也可以是多个对象组合
    但是不要混着用!!!
    """

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

    # 将某本书跟作者的关系全部清空
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.clear()  # 清空当前书籍与作者的所有关系

    """
    add()
    set()
    remove()
    上面三个都支持传数字 或者对象 并且可以传多个 但是set需要传可迭代对象
    
    clear()
    clear括号内不需要传任何参数
    """

 

  ORM跨表查询(*******)

    基于对象的跨表查询

    基于双下划线的查询

"""
    正向与反向的概念
    
    # 一对一
    # 正向:author---关联字段在author表里--->authordetail        按字段
    # 反向:authordetail---关联字段在author表里--->author        按表名小写
    
      
    # 一对多
    # 正向:book---关联字段在book表里--->publish        按字段
    # 反向:publish---关联字段在book表里--->book        按表名小写_set.all() 因为一个出版社对应着多个图书
    
    # 多对多
    # 正向:book---关联字段在book表里--->author        按字段
    # 反向:author---关联字段在book表里--->book        按表名小写_set.all() 因为一个作者对应着多个图书
    
    
    正向查询按外键字段
    反向查询按表名小写
    """
    """基于对象的跨表查询(子查询:将一张表的查询结果当做另外一个查询语句的条件)"""
    """
    强调:在书写orm语句的时候 跟写sql语句一样 
    不要尝试着 一次性写完  应该做到写一点看一点再一点
    """

  

  聚合查询

    aggregate 

    # 1.统计所有书的总价格
    # from django.db.models import Max,Min,Count,Avg,Sum
    #
    # # res = models.Book.objects.aggregate(Sum(‘price‘))
    # res1 = models.Book.objects.aggregate(Avg(‘price‘))
    # res2 = models.Book.objects.aggregate(Count(‘price‘))
    # res3 = models.Book.objects.aggregate(Max(‘price‘))
    # res4 = models.Book.objects.aggregate(Min(‘price‘))
    # res5 = models.Book.objects.aggregate(Max(‘price‘),Min(‘price‘),Count(‘pk‘),Avg(‘price‘),Sum(‘price‘))
    # print(res5)
    # print(res)
    # print(res1)
    # print(res2)

 

  分组

    annotate

    # 统计每一本书的作者个数
    from django.db.models import Max, Min, Count, Avg, Sum
    # res = models.Book.objects.annotate(author_num = Count(‘authors‘)).values(‘author_num‘,‘title‘)
    # print(res)

    # 统计出每个出版社卖的最便宜的书的价格
    # res = models.Publish.objects.annotate(mmp = Min(‘book__price‘)).values(‘name‘,‘mmp‘)
    # print(res)

    # 统计不止一个作者的图书
    # res = models.Book.objects.annotate(author_num=Count(‘authors‘)).filter(author_num__gt=1)
    # print(res)

    """
    只要是queryset对象 就可以无限制的调用queryset对象的方法!!!
    最最常用的就是对一个已经filter过滤完的数据 再进行更细化的筛选
    
    """

    # 查询各个作者出的书的总价格
    # res = models.Author.objects.annotate(sp=Sum(‘book__price‘)).values(‘name‘,‘sp‘)
    # print(res)

 

 

F与Q查询

 F查询

#F查询的本质就是从数据库中获取某个字段的值
    # 查询库存数大于卖出数的书籍
    """之前查询等号后面的条件都是我们认为输入的
        现在变成了需要从数据库中获取数据放在等号后面
    """
    from django.db.models import F
    # res = models.Book.objects.filter(kucun__gt=F(‘maichu‘))
    # print(res)


    # 将书籍库存数全部增加1000
    # models.Book.objects.update(kucun=F(‘kucun‘)+1000)

    # 把所有书名后面加上‘新款‘

    # from django.db.models.functions import Concat
    # from django.db.models import Value
    #
    # ret3 = models.Book.objects.update(title=Concat(F(‘title‘), Value(‘新款‘)))
    # models.Book.objects.update(title = F(‘title‘)+‘新款‘)  # 不能这么写

 

    Q查询

from django.db.models import Q
    # 查询书籍名称是三国演义或者价格是444.44
    # res = models.Book.objects.filter(title=‘三国演义‘,price=444.44)  # filter只支持and关系
    # res1 = models.Book.objects.filter(Q(title=‘三国演义‘),Q(price=444))  # 如果用逗号 那么还是and关系
    # res2 = models.Book.objects.filter(Q(title=‘三国演义‘)|Q(price=444))
    # res3 = models.Book.objects.filter(~Q(title=‘三国演义‘)|Q(price=444))
    # print(res2)


    # Q高级用法
    q = Q()
    q.connector = or  # 修改查询条件的关系   默认是and
    q.children.append((title__contains,三国演义))  # 往列表中添加筛选条件
    q.children.append((price__gt,444))  # 往列表中添加筛选条件
    res = models.Book.objects.filter(q)  # filter支持你直接传q对象  但是默认还是and关系
    print(res)

 

 

 

9.19总结

标签:span   exist   没有   res   价格   query   迭代   ble   level   

原文地址:https://www.cnblogs.com/TZZ1995/p/11552401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!