zoukankan      html  css  js  c++  java
  • Django学习笔记--数据库中的单表操作----增删改查

    1.Django数据库中的增删改查

    1.添加表和字段

    # 创建的表的名字为app的名称拼接类名
    class User(models.Model):
        # id字段 自增 是主键
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        pwd  = models.CharField(max_length=32,null=True)
        
        #新增字段 设置为空或者指定默认值
        age = models.IntegerField(null=True)
        yy = models.CharField(default="你好")
    
        # 删除字段,直接注释掉对应的属性
        # 删除表,直接注释掉整个类即可
    

    对表进行操作之后必须要执行数据库记录和同步数据库的操作

    python3 manage.py makemigrations     数据库表变化记录
    pythons manage.py migrate            数据库同步命令
    

    2.插入数据

    根据创建的模型,对其进行赋值

    # 添加到数据库方式一 :通过对象保存
    user = models.User(name=name,pwd=pwd)
    user.save()
    
    # 添加到数据库方式二 通过表模型固定的使用方式
    user = models.User.objects.create(name=name,pwd=pwd)
    # 返回值可以不用处理,直接调用这个方法,通过表名去创建对应的数据
    

    3.为了方便对数据进行处理,在python脚本中调用Django环境

    创建新的py文件
    import os
    
    # 构建模拟的django运行环境,在下面直接测试数据和修改对应的展示数据
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoDay02.settings")
        import django
        django.setup()
    

    4.对数据操作,增删改查

    # 查询对应的数据,filter过滤数据,查询结果是一个queryset对象,可以理解为一个列表对象
    # first() 取出第一条数据
    res = models.User.objects.filter(id=1)
    print(res)
    # 删除对象,delete()把查询出来的对象都删除,ret对象不用太关注,返回值是影响的数据的数量和对应的值
    ret = models.User.objects.filter(name="你好").delete()
    
    # 删除方式二,获取对象,对象调用删除方法
    user =  models.User.objects.filter(id=2).first()
    user.delete()
    
    # 修改数据第一种方式
    res = models.User.objects.filter(id=3).update(name="我就是我")
    # 第二种方法
    user = models.User.objects.filter(id=3).first()
    user.name = "再次修改"
    user.save() #保存数据
    

    5.单表查询的其他操作

    1.all() 查询所有结果

    # 获取User表中的所有数据
    users = models.User.objects.all()
    print(users)
    
    

    2.filter(**kwargs) 筛选指定条件的对象,对个条件可以同时查询,相当于一个and操作

    user =  models.User.objects.filter(id=2)
    

    3.get(**kwargs) 返回筛选的对象,返回结果之后一个,如果返回的结果超过一个或者一个都没有就会抛出异常,可以查看get的源码会抛出两个异常

     try:
         models.User.objects.get(name__contains='zhang')
     except models.User.DoesNotExist:
         print('值不存在')
     except models.User.MultipleObjectsReturned:
         print("不止一个值")
     else:
         print("有值成功")
    

    4.exclude(**kwargs) 包含了所筛选条件不匹配的对象

    # 把id不等于3的都传过来
    

    user = models.User.objects.exclude(id=3)

    
    5.order_by(*field)     对查询结果进行排序,默认根据id排序,输入要排序的字段名,反向排序在对应的字段前添加-
    
    ```python 
    res = models.User.objects.filter(name__contains="你好").order_by('name')
    res = models.User.objects.all().order_by('-name')
    

    6.reverse() 对查询结果反向排序,必须在order_by之后才能使用reverse(),否则没有效果

    users = models.User.objects.filter(name__contains="你好").reverse()
    

    7.count() 返回查询的querySet对象的个数

    users = models.User.objects.filter(name__contains="你好").count()
    

    8.first() 返回第一条记录

    user =  models.User.objects.filter(id=2).first()
    
    

    9.last() 返回最后一条记录

    user =  models.User.objects.filter(id=2).last()
    
    

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

    # 判断查询结果是否为空
    

    res = models.User.objects.filter(id=30).exists()
    print(res)

    
    11.values(*field)      返回一个valueQuerySet对象一个特殊的QuerySet,运行后得到的是一个可迭代的字典序列,而不是一个model的实例化对象,可以传多个值进行取值操作
    
    ```python
    #获取对应的values,取出对应的name字段对应的值,返回的是一个字典
    ret = models.User.objects.all().values('name')
    print(ret)
    返回结果 <QuerySet [{'name': 'zhangsan'}, {'name': '我就是我'}, {'name': 'zhang1'}, {'name': 'zhang2'}, {'name': 'zhang3'}, {'name': 'zhang4'}, {'name': 'zhang5'}, {'name': 'zhang6'}, {'name': 'zhang7'}, {'name': 'zhang8'}, {'name': 'zhang9'}, {'name': '你好0'}, {'name': '你好2'}, {'name': '你好4'}, {'name': '你好6'}, {'name': '你好8'}, {'name': '你好10'}, {'name': '你好12'}, {'name': '你好14'}, {'name': '你好16'}, '...(remaining elements truncated)...']>
    

    12.value_list(*field) 与values() 非常相似,返回的是一个元组序列,values返回的是一个字段序列,可以传多个值进行取值操作

    # 获取对应的values,取出对应的name字段对应的值,返回的是一个元组
    ret = models.User.objects.all().values_list('name')
    print(ret)
    返回结果 <QuerySet [('zhangsan',), ('我就是我',), ('zhang1',), ('zhang2',), ('zhang3',), ('zhang4',), ('zhang5',), ('zhang6',), ('zhang7',), ('zhang8',), ('zhang9',), ('你好0',), ('你好2',), ('你好4',), ('你好6',), ('你好8',), ('你好10',), ('你好12',), ('你好14',), ('你好16',), '...(remaining elements truncated)...']>
    

    13.distinct() 从返回结果中删除重复数据

    user =  models.User.objects.filter(name='zhangsan').distinct()
    

    6.模糊查询

    # 模糊查询,基于 __双下滑线模糊查询
    # 查询在某个区间的值,查询id在1,2,3,4,5区间的所有值
    ret = models.User.objects.filter(id__in=[1,2,3,4,5])
    ret = models.User.objects.filter(id__range=[1, 200])
    # id__in          在某个区间
    # id__gt          大于某个值
    # id__lt          小于某个值
    # id__gte         大于等于
    # id__lte         小于等于
    # id__range       在某个范围
    # id__contains    包含,
    # id__icontains   忽略大小写
    # id__startswith  以什么开始
    
  • 相关阅读:
    UVA
    UVALive
    找一
    买书最低价格
    NABCD模型分析
    二维数组--首尾
    结对开发---环
    结对开发---二维数组
    电梯设计需求调研报告
    数组求和(2)
  • 原文地址:https://www.cnblogs.com/zj901203/p/10899551.html
Copyright © 2011-2022 走看看