zoukankan      html  css  js  c++  java
  • django之orm

    一 orm创建sql

     1.新建django项目。在项目文件夹下的settings修改配置(将原来的DATABASES隐掉):

      2.在项目的init文件中写入如下命令

      3.开始创建表格:在应用文件夹的models.py文件中创建类:

      4.数据库同步指令:

    (1)python manage.py makemigrations

    (2)python manage.py migrate

    5.查看mysql中的生成情况

      二 orm的增删改查

    增删改查操作命令写在  view视图函数中。Urls里面要配置好相应的路径:

    url(r'^index/', views.index),

    在浏览器中访问该页面,就执行index函数,执行增删改查操作。

     首先在views.py里导入models文件。增删改查操作写在index函数中

    from app01 import models

    1.增加记录

    方式一:
    
    student_obj=models.Students(
            name='abc',
            age=22,
    )
    student_obj.save()
    
     方式二:
    
    new_obj=models.Students.objects.create(name='ABC',age=25)
    print(new_obj)      #Student object    model对象(表对象)
    print(new_obj.name,new_obj.age)
    
     创建方式三:批量创建  bulk_creat方法  速度快。不用向上面一次次save,io操作耗时间
    
    objs_list=[]
    for i in range(20):
        obj=models.Students(
            name='zhao%s'%i,
            age=10+i,
        )
        objs_list.append(obj)
    models.Students.objects.bulk_create(objs_list)
    
     创建方式4:update_or_create() 有就更新,没就创建
    
    models.Students.objects.update_or_create(
        name='哥哥',
        defaults={
            'age':35,
        }
    )

     2.查询

    1)查询所有的 all()方法

     all_obj=models.Students.objects.all()
    
    print(all_obj)

    查询结果是queryset集合(类似列表)。可以通过for循环,通过属性的方式拿到里面的值。< QuerySet[ < Students: Students object>>

    也可以在创建类的里面自定制__str__方法,返回值为self.name。这样Print(all_obj)时,里面的queryset对象的值为name。如< QuerySet[ < Students: abc >>

    (2)条件查询  .filter方法    返回的也是queryset集合

    objs=models.Students.objects.filter(id=2)     #找id为2的记录
    objs=models.Students.objects.filter(name='abc')     #找name为'abc'的记录
    print(objs)

     2)条件查询:get()方法  返回的是model对象

    obj=models.Students.objects.get(id=3)    #找id为3的记录
    print(obj)   

     get()查找有且必须只有一个结果。如果查找的结果为0,或者为多个,那么将报错。(页面得不到结果)

     3.删除 delete()方法    querysetmodel对象都可以调用

    models.Students.objects.get(id=3).delete()      #model对象来调用的delete方法
    models.Students.objects.filter(name='abc').delete()
    models.Students.objects.all().delete()    #删所有的

      4.更新 update()方法  只有queryset对象可以调用update()方法

    models.Students.objects.get(id=6).update(age=99)    #报错
    
    model对象不能调用更新方法  报错信息:Student object has no attribute update
    
    models.Students.objects.filter(id=6).update(age=99)

     三 orm查询

     1.查询

    1filter

    models.Students.objects.filter(id=7,name='哥哥').update(           #,是and关系
        name='妹妹',
        age=18,
    )

     ,表示是and关系

       id=7,name='哥哥'是以关键字形式传入。也可以写成字典形式,但前面加**

    如:models.Students.objects.filter(**{'id':'7','name':'妹妹'}).update(age=28)
    

    2exclude(**kwargs) :排除,objects控制器和queryset集合都可以调用,返回结果是queryset类型

    query=models.Students.objects.exclude(id=10)   #objects控制器调用
    
    query = models.Students.objects.filter(name='abc').exclude(id=10)  #queryset集合调用

     3)排序  order_by

    query=models.Students.objects.all().order_by('age','id')    #'-id' 按id降序排序  。先按age排序,相同的再按id排序

     4)反转 reverse

    反转在排序之后才有用

    如:
    
    query = models.Students.objects.all().order_by('id').reverse()
    
    这样就不行
    
    query = models.Students.objects.all().reverse()

     5count计数     queryset调用,返回数字

    num=models.Students.objects.all().count()

     6first()last()     返回第一条、最后一条记录  返回的是记录(model对象)

    obj=models.Students.objects.all().first()

     7exits()   返回布尔值

    obj=models.Students.objects.filter(name='姐姐').exists()    #比if判断效率高

     8alue_list values返回queryset类型

    query=models.Students.objects.filter(age=18).value_list()

    加上value_list,打印对象由<Queryset[Students:哥哥],[],[]>变为<Queryset [(1,'哥哥',18),(),()]>   元祖

    返回指定字段,就在value_list()里加入字段

    query=models.Students.objects.filter(age=18).value_list(‘name’,’age’)
    
     query=models.Students.objects.filter(age=28).values()   #values('name','age')

     (9)去重 distinct  放在valuesvalue_list后面

     query=models.Students.objects.all().distinct()    #distinct()里不能加field   .all()方法去重没意义
    
     query = models.Students.objects.all().values('age').distinct()

     2.模糊查询

    基于双下划线的模糊查询 filter()

    1)大于  __gt

    # query=models.Students.objects.filter(id__gt=7)    # id__gt=7 表示id>7

     2)大于等于  __gte

    query=models.Students.objects.filter(id__gte=7)    # id__gte=7 表示id>=7

     (3)小于、小于都等于   __lt __lte

    query=models.Students.objects.filter(id__lt=7)    # id__lt=7 表示id<7

     4)在列表之中   __in

    query=models.Students.objects.filter(id__in=[6,8,10])    #表示id在后面列表之中的
    

      (5)在区间范围内(闭区间)  __range

    query=models.Students.objects.filter(id__range=(8,10))    # 8<=id<=10  between and

     6)包含字符串  __contains   __icontains(不区分大小写)

    query=models.Students.objects.filter(name__contains='妹妹')    # name字段里有"妹妹"字符串  (必须是字符串类型)

     7__endswith__startswith 以什么结尾,以什么开头。 前面也可以加i。不区分大小写。

     3.日期相关操作

    1)插入日期

    import datetime
    current_date=datetime.datetime.now()
    models.Birthday.objects.create(name='zhao',date=current_date)

     也可以直接插入字符串

    models.Birthday.objects.create(name='yang',date='1999-1-9')   #传字符串进去也行

     2)查询

     query=models.Birthday.objects.filter(date__year='2000')   #查询日期年份为2000
    
    query=models.Birthday.objects.filter(date__year='2000',date__month='12')   #查询日期年份为2000,月份为12月的
    date__day__gt=8     #日期大于8号的

      

     

     

     

     

     

     

  • 相关阅读:
    hoj 1061 排列树问题
    [译稿]Google的9条创新原则(转)
    vs2008 Sys未定义比较完整的解决方案
    js右下角升起小窗口脚本示例
    扩展了flash8里array的方法
    js 滚动、切换代码的搜集
    prototype 1.3.1 跟 ajax冲突!!!莫名其妙!
    用AS删除Flash中输入文本开始和结尾的空格【转载】
    Flash右键触发与屏蔽
    实现Flash跨域访问
  • 原文地址:https://www.cnblogs.com/yq055783/p/12342787.html
Copyright © 2011-2022 走看看