zoukankan      html  css  js  c++  java
  • Django 07模型层—单表操作(增删改查)

    单表查询

    一.数据库相关设置

    ''' 
    # Mysql连接配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_name',
            'HOST': '127.0.0.1',
            'USER': 'root',
            'PASSWORD': 'root'
        }
    }
    
    # 配置ORM的loggers日志
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level': 'DEBUG',
            },
        }
    }
    '''
    
    '''
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=16)
        age = models.IntegerField()
        birthday = models.DateField()
    '''
    

    二、测试文件运行Django项目

    '''
    1. 加载项目配置文件
    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
    2. 启动Django
    import django
    django.setup()
    3. 使用项目中的各个模块
    from my_app.models import User
    '''
    

    三、简单增删改查

    Django的Queryset和objects对象

    '''
    1. QuerySet是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率。也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。
    
    2. Objects是django实现的mvc框架中的数据层,django中的模型类都有一个objects对象,它是一个django中定义的QuerySet类型的对象,它包含了模型对象的实例。
    
    简单的说,Objects是单个对象,QuerySet是许多对象。
    
    QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只要你查询的时候才真正的操作数据库。
    '''
    

    1、增

    '''
    User.objects.create(name='henry',age='30',birthday='1989-10-13')
    
    user = User(name='wendy',age='25',birthday='1994-8-28')
    user.save()
    '''
    

    2、查

    '''
    # 操作的结果是一个list,类型是queryset
    u_list = User.objects.filter(name='henry')
    
    # 只能操作有且只有一条数据的记录
    user = User.objects.get(id=1)
    
    try:
        u2 = User.objects.get(name='wendy')
        print(u2)
    except Exception:
        print('wendy对象不唯一!')
    '''
    

    3、改

    '''
    User.objects.filter(id=2).update(birthday='1994-10-3')
    
    user=User.objects.filter(name='wendy')[0]
    user.birthday = '1994-8-28'
    user.save()
    '''
    

    4、删

    '''
    User.objects.filter(id=1).delete()
    
    user = User.objects.filter(name='wendy')[0]
    user.delete()
    '''
    

    四、单表操作函数

    '''
    1. all():查询所有结果list,类型是QuerySet,支持正向索引取值[i],支持索引切片[m:n]
    QuerySet对象具有query属性,里面存放的的是得到该结果执行的sql语句(ORM内部还存在对sql语句的优化)
    支持正向索引(不支持反向索引,原因是数据过多时,不能将数据一次性查出,需要分批次按需求查出)
    u_l=User.objects.all()[1:3] 得到索引为1,2的两条数据
    
    2. filter(**kwargs):查询结果是一个包含满足条件的所有数据的列表,类型为QuerySet			  
    
    3. get(**kwargs):查询满足条件的唯一对象obj,查询结果不为obj则抛出异常		  
    
    4. exclude(**kwargs):查询结果是一个包含满足条件的对立面的所有数据的列表,类型为QuerySet
    
    5. order_by(*field):查询按照指定字段进行排序后的所有结果,返回值是一个list,类型为QuerySet,'tag_name'代表正序,'-tag_name'代表降序
    User.objects.order_by('id')  #按照id正序排序
    User.objects.order_by('-id')  #按照id降序排序
    
    6. reverse():反转排序查询的所有结果,返回值为一个list
    User.objects.order_by('id').reverse()
    
    7. count():统计返回查询结果list的长度
    count = User.objects.all().count()
    
    8. first():返回查询结果中的第一个对象obj
    
    9. last():返回查询结果中的最后一个对象obj
    
    10. exists():判断查询结果是否存在,值为布尔类型
    res = User.objects.filter(id=6).exists()
    print(res)
    
    11. values(*field):按照指定字段(们)进行查询,返回存放包含字段(们)的字典类型的列表list
    u_l5_dic = User.objects.values('id','name')
    print(u_l5_dic)
    结果:<QuerySet [{'id': 1, 'name': 'henry'}, {'id': 2, 'name': 'wendy'}>
    
    12. values_list(*field):与values(*field)类似,但返回值是存放数据的元组类型的列表list
    u_l6 = User.objects.values_list('id','name')
    print(u_l6)
    结果:<QuerySet [(1, 'henry'), (2, 'wendy')]>
    
    13. distinct():从查询结果中剔除重复字段(一般和values结合使用),不能对数据库进行去重操作,只是在结果中剔除了重复的字段
    u_17 = User.objects.values('name','age','birthday').distinct()
    print(u_17)
    '''
    
    '''
    配置ORM的loggers日志
    print(user_list)  #得到的sql语句是经过ORM框架优化后的sql语句,是真正交给pymysql执行的sql语句
    print(user_list.query)  #结果是将这个对象转化为sql语句的初步sql
    '''
    
    

    五、模糊查询

    '''
    user_list = User.objects.filter(id__gte=1)
    
    # 整型相关
    age__exact=8  # 确切匹配8
    age__in=[8, 10]  # 8或10
    age__gt=8  # 大于8
    age__gte=8  # 大于等于8
    age__lt=8  # 小于8
    age__lte=8  # 小于等于8
    age__range=[8, 10]  # 8到10之间
    
    age__isnull=0|1  
    u_111 = User.objects.filter(id__isnull=1)  # 1:该字段为空的所有数据 | 0:该字段不为空的所有数据
    
    # 字符串相关
    name__startswith  # 后方模糊匹配
    u_l12 = User.objects.filter(name__startswith='s')
    print(u_l12)
    
    name__endswith  # 前方模糊匹配
    u_l13 = User.objects.filter(name__endswith='y')
    print(u_l13)
    
    name__contains  # 前后方均模糊匹配
    u_l14 = User.objects.filter(name__contains='n')
    print(u_l14)
    
    name__regex  # 正则匹配
    u_l15 = User.objects.filter(name__regex="n{1,}") #名字中含有一个或多个n
    print(u_l15)
    在这里正则匹配不能用w代表所有字母数字,这样会被解析成是否含有w这个字符,而是要用[a-zA-Z0-9]代替
    u_l16 = User.objects.filter(name__iregex="[a-zA-Z0-9]{1,}") #名字中含有一个或多个字符
    print(u_l16)
    
    name__istartswith  # 不区分大小写后方模糊匹配(i开头就是不区分大小写)
    u_l17 = User.objects.filter(name__istartswith='s')
    print(u_l17)
    
    # 时间相关
    birthday__year=2008  # 时间年份模糊匹配
    u_l18 = User.objects.filter(birthday__year=1989)
    print(u_l18)
    '''
    
    

    六、F与Q查询

    '''
    from django.db.models import F, Q
    # F基于计算 F('字段名')
    # 案例一:将id为1的结果年龄增加1
    User.objects.filter(id=1).update(age=F('age')+1) #age=age+1 是错误的,update不能完成二步操作
    
    # 案例二:查询id是年龄1/4的结果
    user = User.objects.filter(id=F('age')/6)
    
    #>> 与 <<
    print(8>>1) => 4
    print(8<<1) => 16
    
    
    
    # Q基于关系 Q('字段条件')
    u_l19 = User.objects.filter(name__regex='henry',age=30) #默认是与关系 &
    print(u_l19)
    # 与 &
    User.objects.filter(Q(id=1) & Q(age=30))  # id=1 并且 age=30
    
    # 或 |
    User.objects.filter(Q(id=1) | Q(id=2))  # id=1 或 id=2
    User.objects.filter(Q(age__lt=20) | Q(name__icontains='a')) #年龄小于20或姓名包含a
    
    # 非 ~
    User.objects.filter(~Q(id=1))  # id 不为 1
    User.objects.filter(~Q(age__lte=25)) #年龄不小于等于25
    
    '''
    
    
  • 相关阅读:
    Vue学习笔记vueelementadmin 前端学习
    Vue学习笔记Vue.js2.X 学习(三)===>组件化高级
    Vue学习笔记rest_framework_jwt 学习
    Vue学习笔记Django REST framework3后端接口API学习
    Vue学习笔记Vue.js2.X 学习(一)===>基本知识学习
    Vue学习笔记Vue.js2.X 学习(二)===>组件化开发
    Vue学习笔记Windows系统Git安装(按装vueelementadmin报错)
    跑马灯
    使用信号量的线程同步实验
    按键盘数码管显示实验
  • 原文地址:https://www.cnblogs.com/liubinliuliu/p/10532680.html
Copyright © 2011-2022 走看看