zoukankan      html  css  js  c++  java
  • 11.27

    模型层

    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()

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/maqiaobin/p/11945153.html
Copyright © 2011-2022 走看看