zoukankan      html  css  js  c++  java
  • 模型层

    模型层

    ORM查询

    单表操作

    配置测试脚本

    方式一:

    直接在某一个应用的tests文件中书写下面内容

    import os				
    if __name__ == "__main__":
    	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
    	import django
    	django.setup()
        # 一定要等待测试脚本搭建完毕,才能导入Django进行测试
        from app01 import models
    

    方式二:

    直接新建一个任意名称的py文件,在里面也写上面的配置

    import os				
    if __name__ == "__main__":
    	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
    	import django
    	django.setup()
        # 一定要等待测试脚本搭建完毕,才能导入Django进行测试
        from app01 import models
    

    数据的增删改查

    #create方法
    obj=models.表名.objects.create(字段名='xxx',)
    #利用对象的绑定方法
    obj=models.表名(字段名='xxx')
    obj.save()
    

    res = models.表名.objects.filter(pk=1)
    

    pk会自动帮你查找到当前表的主键字段 所以后期我们都是用pk来指代主键字段filter查询出来的结果是一个Queryset对象

    特点:

    1. 只要是queryset对象就可以无限制的调用queryset方法
    2. 只要是queryset对象就可以点query查看当前结果内部对应的sql语句
    #方式一 利用queryset方法
    models.表名.objects.filter(pk=1).update(字段名=值)
    
    #方式二 利用对象
    obj = models.表名.objects.get(pk=1)
    obj.字段名 = 值
    obj.save() 
    # 该方法不推荐使用,推荐使用queryset方法
    

    get和filter区别

    1. filter获取到的是一个queryset对象,类似于一个列表

    2. get获取到的直接就是数据对象本身

      当条件不存在的情况下,filter不报错直接返回一个空 (推荐使用queryset)

      get直接报错

    #利用queryset方法 delete()
    models.表名.objects.filter(pk=3).delete()
    
    #对象方法
    obj = models.表名.objects.get(pk=3)
    obj.save()
    

    在配置文件中配置相应的代码即可查看所有orm语句内部对应的sql语句

    LOGGING = {    
        'version': 1,    
        'disable_existing_loggers': False,    
        'handlers': {        
            'console': {            
                'level': 'DEBUG',            
                'class': 'logging.StreamHandler',        
            },    
        },    
        'loggers': {        
            'django.db.backends': {            
                'handlers': ['console'],            
                'propagate': True,            
                'level': 'DEBUG',        
            },    
        }
    }
    

    1. all()

    查询所有,返回queryset对象

    res = models.Books.objects.all()
    

    2. filter()

    筛选,相当于原生sql语句中的where关键字,返回queryset对象

    res = models.Books.objects.filter(pk=1,title='三')
    

    3. get()

    筛选,获取的是数据对象本身,条件不存在直接报错,查询条件必须唯一

    res = models.Books.objects.get(title='西游记')
    

    4. first()

    取queryset对象中第一个数据对象

    res = models.Books.objects.filter(title='西游记').first()
    

    5.last()

    取queryset对象中最后一个数据对象

    res = models.Books.objects.filter(title='西游记').last()
    

    6. count()

    统计数据的个数

    res = models.Books.objects.count()
    

    7. values()

    获取数据对象中指定的字段的值,可以有多个,返回的是列表套字典

    res = models.Books.objects.values('title','price')
    

    8. values_list()

    获取数据对象中指定的字段的值,可以有多个,返回的是列表套元祖

    res = models.Books.objects.values_list('title','price')
    

    9. order_by()

    按照指定的字段排序,默认是升序,如果要降序就在字段前面加负号

    res1 = models.Books.objects.all().order_by('price')
    

    10.reverse()

    颠倒顺序,颠倒的对象必须有顺序

    res3 = models.Books.objects.all().order_by('price').reverse()
    

    11. exclude()

    排除什么什么之外 返回的是queryset对象

    res = models.Books.objects.all().exclude(title='三国演义')
    

    12.exists()

    判断查询结果是否有值,返回一个布尔值

    res = models.Books.objects.filter(pk=1).exists()
    

    13. dixtinct()

    对查询结果进行去重

    res = models.Books.objects.values('title','price').distinct()
    

    双下划线查询

    #查询价格大于500的书籍
    res = models.Books.objects.filter(price__gt=500)
    #查询价格小于400 的书籍
    res = models.Books.objects.filter(price__lt=400)
    #查询价格大于等于500
    res = models.Books.objects.filter(price__gte=444.66)  对数字精确度不敏感
    res = models.Books.objects.filter(price__gte=500)
    #查询价格小于等于500的书籍
    res = models.Books.objects.filter(price__lte=500)
    #查询价格是222.66或者444.22或者500的书籍
    res = models.Books.objects.filter(price__in=[222,444,500])
    #查询价格在200到800之间的书籍
    res = models.Books.objects.filter(price__range=(200,800))  # 顾头顾尾
    #查询出版日期是2019年的书籍
    res = models.Books.objects.filter(publish_date__year='2019')
    #查询出版日期是1月份的书籍
    res = models.Books.objects.filter(publish_date__month='1')
    

    模糊查询

    #查询书籍是以三开头的书
    res = models.Books.objects.filter(title__startswith='三')
    #查询书籍是以义结尾的书
    res = models.Books.objects.filter(title__endswith='1')
    #查询书籍名称中包含游字的书籍
    res = models.Books.objects.filter(title__contains='游')
    #查询书籍名称中包含字母p的书籍
    res = models.Books.objects.filter(title__contains='p')  # 默认区分大小写
    res = models.Books.objects.filter(title__icontains='p')  # 忽略大小写 加i
    

    一对多字段数据的增删改查

    #第一种  直接传表里实际的数据,跟数据主键值
    models.Book.object.create(title='xxx',price=213,publish_id=1)
    
    #第二种 传虚拟字段,跟数据对象即可
    publish_obj= models.Publish.objects.filter(pk=2).first()
    models.Book.objecets.create(title='sss',price=123,publish=publish_obj)
    

    #第一种 
    models.Book.objects.filter(pk=1).update(publish_id=2)
    
    #第二种
    publish_obj = models.Publish.objects.filter(pk=1).first()
    models.Book.objects.filter(pk=1).update(publish=publish_obj)
    

    models.Publish.objects.filter(pk=1).delete() #默认联级删除
    

    多对多字段数据的增删改查

    # 方法一
    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.authors.add(1) #在第三张表里给书籍绑定一个主键为1的作着
    
    #方法二
    author_obj = models.Author.objects.filter(pk=1).first()
    book_obj.authors.add(author_obj)
    
    #add方法 能够朝第三张关系表添加数据,既支持数字,也支持对象,都可以是多个
    

    # 方法一
    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.authors.set((1,3))
    
    #方法二
    author_obj = models.Author.objects.filter(pk=1).first()
    book_obj.authors.set((author_obj))
    
    #set修改多对多关系表中的数据,既可以传数字也可以传对象,但是需要注意的是括号内必须是可迭代对象,都支持多个
    

    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.authors.remove(1,2)
    
    author_obj = models.Author.objects.filter(pk=1).first()
    book_obj.authors.remove(author_obj)
    # remove既可以传数字 也可以穿对象 并且都支持传多个 不需要迭代
    

    清空

    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.authors.clear()
    # clear清空书籍相关所有记录  括号内不需要传递参数 
    

    跨表查询

    正反向查询

    关系字段在谁哪 由谁查谁就是正向

    如果关系字段 就是反向

    正向查询按字段

    反向查询按表名小写 + _set

    当正向查询点击外键字段数据有多个的情况下 需要.all()

  • 相关阅读:
    MapReduce案例WordCount
    MapReduce排序案例
    MapReduce倒排索引
    MapReduce自定义排序编程
    GroupingComparator 自定义分组
    CombineTextInputFormat小文件处理场景
    cdh 2.6.0版本和apache 2.7.x版本 本地执行环境的差异。
    DistributedCache 分布式缓存
    MapReduce数据压缩机制
    MapReduce其他功能
  • 原文地址:https://www.cnblogs.com/shin09/p/11970968.html
Copyright © 2011-2022 走看看