• Django之模型层


    Django之模型层

    ORM查询

    1.为了让你更好的去测试你的查询语句.可以做以下几步操作
    第一步:新建一个测试文件test.py, 然后把manage.py文件的一些内容复制进去
    第二部:在settings下面添加一个配置文件.这样你就可以在你的测试文件去测试了,他可以显示出你所用到了sql语句.
    配置如下:
    test.py
    import os
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "many_search.settings")
        import django
        django.setup()
        
    settings.py下:
        LOGGING = {
            'version': 1,
            'disable_existing_loggers': False,
            'handlers': {
                'console': {
                    'level': 'DEBUG',
                    'class': 'logging.StreamHandler',
                },
            },
            'loggers': {
                'django.db.backends': {
                    'handlers': ['console'],
                    'propagate': True,
                    'level': 'DEBUG',
                },
            }}
    练习:
       # 单表操作
        # 增删改查
        # 增
        # models.Book.objects.create(title='火影忍者', price=144.11, publish_id=1)
        #
        # # 删
        # models.Book.objects.filter(pk=1).delete()
        #
        # # 改
        # models.Book.objects.filter(pk=1).update(price=123)
        # 这里只要演示一些查询主要方法十三种
    
        # 1.all()  查询所有数据
        # res = models.Book.objects.all()   #惰性查询
        # print(res)  # 你调用它才做
    
        # 2.filter() 过滤拿指定的
        # res = models.Book.objects.filter(pk=2)
        # print(res)
    
        # 3.get() 只拿一个,有多个是默认最后一个
        # res = models.Book.objects.get(pk=1)
        # print(res)
    
        # 4.first()   拿第一个
        # res = models.Book.objects.filter(pk=1).first()
        # print(res)
    
        # 5.last() 拿最后一个
        # res = models.Book.objects.filter(pk=1).last()
    
        # 6.exclude  除此之外
        # res = models.Book.objects.exclude(pk=1)
        # print(res)
    
        # 7.values   列表套字典
        # res = models.Book.objects.values('title')
        # print(res)
    
        # 8.values_list   列表套元祖
        # res = models.Book.objects.values_list('title')
        # print(res)
    
        # 9.count()  统计数据的个数
        # res = models.Book.objects.count()
        # res1 = models.Book.objects.all().count()
        # print(res, res1)
    
        # 10.distinct()  去重
        #数据必须是一模一样的情况下才能能去重
        # res = models.Book.objects.all().distinct()
        # res1 = models.Book.objects.values_list('title').distinct()
        # print(res, res1)
    
        # 11.order_by()  排序, 默认升序
        # res = models.Book.objects.order_by('price')
        # print(res)
    
        # 12.reverse()  反转, 前面必须先结果排序
        # res = models.Book.objects.order_by('price').reverse()
        # print(res)
    
        # 13.exists()  判断数据是否存在,反回true和false
        # res = models.Book.objects.filter(pk=8).exists()
        # print(res)
    
    
        """神奇的下划线查询"""
        # 查询价格大于200的书籍
        # res = models.Book.objects.filter(price__gt=200)
        # print(res)
    
        # 查询价格小于200的书籍
        res = models.Book.objects.filter(price__lt=200)
        print(res)
    
        # 查询价格大于或者等于200的书籍
        res = models.Book.objects.filter(price__gle=200)
        print(res)
    
        # 查询价格小于或者等于200的书籍
        res = models.Book.objects.filter(price__lte=200)
        print(res)
    
        # 查询价格是200或则是123.12或144.22
        res = models.Book.objects.filter(price__in=[200, 123.12, 144.22])
        print(res) #拿到一个就反回
        
        # 查询价格是200 到700之间的书籍
        res = models.Book.objects.filter(price__range=(200, 700))
        print(res)
        
        # 模糊匹配
        
        #  查询书籍名称中包含p的
        # contains 区分大小写
        # icontains 忽略大小写
        res = models.Book.objects.filter(title__contains='p') # 区分大小写
        print(res)
        
        res = models.Book.objects.filter(title__icontains='p') # 忽略大小写
        print(res)
        
        # 查询书籍名称已三开头的书籍
        # startswith  以什么开头
        # endswith    以什么结尾
        res = models.Book.objects.filter(title__startswith='三')
        res1 = models.Book.objects.filter(title__endswith='p')
        print(res, res1)
        
        # 查询出版日期是2019年的书籍 year
        res = models.Book.objects.filter(publish_data__year='2019')
        print(res)
        
        #查询出版日期是10月的书籍month
        res = models.Book.objects.filter(publish_date__month='10')
        print(res)
        
        
       
      # 一对多字段增删改查
        # 增
        # models.Book.objects.create(title='海贼王', price=200, publish_id=1)
        #
        # publish_obj = models.Publish.objects.filter(pk=2).first()
        # models.Book.objects.create(title='死神', price=300, publish=publish_obj)
        #
        # # 查
        # book_obj = models.Book.objects.filter(pk=1).first()
        # print(book_obj.publish)
        # print(book_obj.publish_id)
    
        # 改
        # book_obj = models.Book.objects.filter(pk=1).update(publish_obj=3)
        # publish_obj = models.Publish.objects.filter(pk=2).first()
        # models.Book.objects.filter(pk=2).update(publish=publish_obj)
    
        # 删除
        # models.Publish.objects.filter(pk=3).delete()
        # 默认是级联删除
    
        # 多对对字段的增删改查
    
        # 增
    
        # 给组件为3的书籍添加两个作者 1 ,2
        # book_obj = models.Book.objects.filter(pk=3).first()
        # 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() 括号内既可以传数字也可以传数据对象,并且支持多个
    
        # 修改关系
        # 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() 括号内,既可以传数字也可以传对象,
        # 并且也是支持传多个的,但是必须要注意的是,括号内的必须是一个可迭代对象
    
        # 删
        # book_obj = models.Book.objects.filter(pk=3).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()
        # book_obj.authors.remove(author_obj)
        # book_obj.authors.remove(author_obj, author_obj1)
    
        # remove() 括号内, 既可以传数字也可以传对象,并且也是支持多个的
    
        # 清空
        book_obj = models.Book.objects.filter(pk=3).first()
        book_obj.authors.clear()
    
        # clear() 括号内不需要传值, 直接回清空当前书籍对象的所有记录
        
        
         """
        ORM跨表查询
            1.子查询
            2.联表查询
        
        正反向概念
            外键字段在谁那 由谁查谁就是正向的
            谁的手里有外键字段 谁就是正向查
            没有外键字段查 就是反向查
            如:
              书籍对象 查 出版社  外键字段在书籍 正向查
              出版社对象 查 书籍  外键字段在书籍 反向查
            
            谨记:
               正向查询按字段
               反向查找按表名(小写)
    
        """
        # 1.基于对象的跨表查询   (子查询)
        # 1.查询书籍是三国演义的出版社名称 一对多表
        # book_obj = models.Book.objects.filter(title='三国演义').first()
        # 正向查询按字段
        # print(book_obj.publish.name)
        # print(book_obj.publish.addr)
        # 2.查询书籍主键是3的作者的姓名  多对多表
        # book_obj = models.Book.objects.filter(pk=1).first()
        # print(book_obj.authors.all())
        # 3.查询作者是路遥的手机号   一对一表
        # author_obj = models.Author.objects.filter(name='路遥').first()
        # print(author_obj.author_detail.addr)
    
        """
        正向查询 按字段
        当然字段所对应的数据有多个的时候, 需要加上.all()拿到所有的意思
        否则点外键字段直接就能拿到数据
        """
    
        # 反向(按照表名小写)
    
        # 4.查询出版社是北京出版社出版过的书籍  一对多
        # publish_obj = models.Publish.objects.filter(name='北京出版社').first()
        # print(publish_obj.book_set.all()) # 多值
        # 5.查询作者是爱丽丝写过的所有书  多对多
        # author_obj = models.Author.objects.filter(name='爱丽丝').first()
        # print(author_obj.book_set.all())
        # 6.查询年龄是34的作者
        # author_detail_obj = models.AuthorDetail.objects.filter(age=34).first()
        # print(author_detail_obj.author.name)
    
        """
        反向查询按照表名小写
          当查询的结果可以是多个的情况下, 需要加_set.all()
          当查询结果只有一个的情况下是不用加东西的,表名小写点你想要的值即可
        """
        # 7.查询书籍是三国演义的作者的手机号
        # book_obj = models.Book.objects.filter(title='三国演义').first()
        # print(book_obj.authors.all())
    
        # 2.基于双下划线的跨表查询, 联表查询
        """
        MysSQL中
           left join 左连接
           inner join 内连接
           right join 右连接
           union       全连接
        """
    
        # 1.查询书籍是三国演义的出版社名称
        # 正向
        # res = models.Book.objects.filter(title='三国演义').values('publish__name')
        # print(res)
        # 反向
        # res = models.Publish.objects.filter(book__title='三国演义').values('name')
        # print(res)
    
        # 2.查询作者是路遥的年龄
        # 正向
        # res = models.Author.objects.filter(name='路遥').values('author_detail__age')
        # print(res)
        # # 反向
        # res = models.AuthorDetail.objects.filter(author__name='路遥').values('age')
        # print(res)
    
        # 3.查询年龄是34的作者姓名
        # res =models.AuthorDetail.objects.filter(age=34).values('author__name')
        # print(res)
        #
        # res = models.Author.objects.filter(author_detail__age=34).values('name')
        # print(res)
    
        # 4.查询出版社是北京出版社的书籍名称
        # res = models.Publish.objects.filter(name='北京出版社').values('book__title')
        # print(res)
        # res = models.Book.objects.filter(publish__name='北京出版社').values('title')
        # print(res)
        # 7. 查询书籍是海贼王的作者的手机号
        res = models.Book.objects.filter(title='三国演义').values('authors__author_detail__age')
        print(res)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    Unsupported major.minor version 52.0
    图片资源的加密和cocos2d-x中的解密
    python 生成器生成杨辉三角
    python非递归全排列
    一个对象合并的函数引发的错误
    什么是原生的javascript
    quick3.5 removeFromParent()导致的windows下模拟器崩溃问题
    this关键字和static关键字
    内存分析
    面向对象:类和对象
  • 原文地址:https://www.cnblogs.com/kangwy/p/11735455.html
Copyright © 2020-2023  润新知