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号的

 

  

 

 

 

 

 

 

 

posted @ 2020-02-21 19:57  yq055783  阅读(147)  评论(0编辑  收藏  举报