美文网首页
Django-模型的增删改查

Django-模型的增删改查

作者: 遇明不散 | 来源:发表于2019-05-16 22:15 被阅读0次

    模型中的增删改查

    增加数据
    # 以下Entry代表实体类
    # 方案1
    Entry.objects.create(属性=值,属性=值)
    # 返回值:创建好的实体对象
    
    # 方案2
    # 创建一个 Entry 对象,并通过 save() 进行保存
    obj = Entry(属性=值,属性=值)
    obj.属性 = 值
    obj.save()
    # 无返回值,保存成功后,obj会被重新赋值
    
    # 方案3
    # 使用字典构建对象,并通过 save() 进行保存
    dic = {
        '属性1':'值1',
        '属性2':'值2',
    }
    obj=Entry(**dic)
    obj.save()
    
    查询数据
    • 所有接口必须通过 Entry.objects 调用查询接口函数
    Entry.objects.filter()
    Entry.objects.exclude()
    
    • 所有的查询接口函数,都可以通过一个 query 属性来得到对应的sql语句
    Entry.objects.filter().query
    
    基本查询操作
    Entry.objects.all()
    # 返回:QuerySet(查询结果集,是一个封装了若干对象的列表)
    # 可以循环遍历
    
    查询返回指定列
    # 查询所有的列并封装到字典中
    Entry.objects.values()
    # 查询部分列并封装到字典中
    Entry.objects.values('列1','列2')
    # 也允许将values() 放在其他返回查询结果集的方法的后面
    Entry.objects.all().values()
    Entry.objects.filter().values('列1','列2')
    
    # 将结果封装到元组中再封装到列表中
    Entry.objects.values_list()
    
    只查询一条数据
    Entry.objects.get(条件)
    # 查询只返回一条数据
    # 该方法只能查询一条数据
    # 查询多于一条数据或没查询出结果的话那么都会抛异常
    
    根据条件查询部分行数据
    Entry.objects.filter(条件)
    
    # 查询id为1的Author的信息
    Author.objects.filter(id=1)
    
    # 查询id为1,并且name为隔壁老王的信息
    Author.objects.filter(id=1,name='隔壁老王')
    # 多条件,使用 ,  隔开即可
    # 用 , 隔开的条件,映射到sql中是使用 and 来连接的
    
    # 查询age 大于等于 30 的 author 的信息
    Author.objects.filter(age>=30) # 错误
    # 在条件查询中,Django提供了若干查询谓词(Field Looups),可以完成非等值条件的查询
    Entry.objects.filter(属性__查询谓词=值)
    Author.objects.filter(age__gte=30)
    
    对条件取反
    Entry.objects.exclude(条件)
    
    Author.objects.exclude(id=1)
    # select * from index_author where not(id=1)
    
    Author.objects.exclude(id=1,age__lt=30)
    # select * from index_author where  not (id=1 and age < 30)
    
    聚合查询(不带分组)
    Entry.objects.all().aggregate(名=聚合函数('列'))
    
    # 对Author中age求平均数
    Author.objects.all().aggregate(avg=Avg('age'))
    
    # 聚合函数
    # Avg() : 平均值
    # Count() :数量
    # Sum() : 求和
    # Min() : 最小值
    # Max() : 最大值
    
    聚合查询(带分组)
    Entry.objects.all().values('列1','列2').annotate(列=聚合函数()).values('列1','列2')
    # 第一个 values() 表示分组的条件
    # annotate() 表示分组后执行的聚合操作
    # 第二个values() 表示聚合操作后要进行字典封装的列
    
    排序查询
    Entry.objects.order_by('列1','-列2')
    # 默认是升序排序,列名前加 - 则表示降序排序
    
    F查询和Q查询
    • F() 在执行中获取某列的值
    from django.db.models import F
    # 给所有的age加10
    Author.objects.all().update(age=F('age')+10)
    
    • Q() 在查询条件中可以完成 or 操作
    from django.db.models import Q
    # 查询Author中id为1 或 年龄为 48 的人的信息
    Author.objects.filter(Q(id=1)|Q(age=48))
    
    修改
    修改单个实体

    • 通过 get() 得到要修改的实体对象

    • 通过对象的属性修改对象的值
    • 保存
      通过对象的save()保存回数据库
    # 修改id=1的对象
    author = Author.objects.get(id=1)
    author.name = 'Jason Wang'
    author.age = 25
    author.email = '1097561466@qq.com'
    author.save()
    
    批量修改数据

    调用QuerySet的update(属性=值,属性=值)实现批量修改

    # 批量修改isActive的值
    Author.objects.filter(isActive=False).update(isActive=True)
    
    删除

    调用实体对象/查询结果集的 delete() 完成删除

    删除单个对象
    # 删除 id=1 的对象
    au = Author.objects.get(id=1)
    au.delete()
    
    删除多个对象
    # 删除Author表中isActive的值为False的所有数据
    auList = Author.objects.filter(isActive=False)
    auList.delete()
    
    原生的数据库操作方法(不推荐)
    查询
    Entry.objects.raw(sql)
    # 返回:QuerySet
    
    增删改
    from django.db import connection
    def doSQL(request):
        with connection.cursor() as cursor:
            sql = 'delete from ...'
            cursor.execute(sql)
            return ''
    

    相关文章

      网友评论

          本文标题:Django-模型的增删改查

          本文链接:https://www.haomeiwen.com/subject/taawaqtx.html