django运用 ORM 对有关数据库的操作

创建模型以后,会生成相关的数据库,我们往往会面对对数据库进行基本的操作,下面总结一些django中对数据库的相关操作:

一、基本的增删改查:

一张表映射一个类,一个实例对象相当于表中的一条记录增加有两种方法

1、增加:

(1)create()方法: 创建的类名.objects.create(各种字段实例化) (这里要注意的是在引用类之前要先将类import进来eg:from app名.models import *)

如果字段过多可以采用下面的形式(dic 是直接获取的用户提交的数据):

dic={

'user':'student',

'pwd':'123456'',

}

类名.objects.create(**dic)

这里创建以后不需要保存就会自动保存在数据库里

(2)先创建实例化对象,然后用.save()保存,实例:

b=类名(Book)(各种字段实例化:name='django',price=63........)

b.save()

2、删除:

类名.objects.filter(一个或多个字段).delete()

3、更改:

方法一: 类名.objects.filter(一个或多个字段).update(字段=新值)

类名.objects.filter(一个或多个字段)【这样获得的是QuerySetk类型,是对象的集合】关于QuerySetk类型下面会细说

方法二:

b=类名.objects.get(字段)(!!!!不能用filter方法)

b.price=999(b.字段=新值) 

b.save()

建议:使用第一种方法,方法二中执行save()方法时,无论字段是否发生变化都会重新保存一次,效率太低

4、查询:

这里直接用代码说明

# 获取个数
    #
    # Tb1.objects.filter(name='seven').count()
    # 大于,小于
    #
    # Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
    # Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
    # Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
    # in
    #
    # Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    # Tb1.objects.exclude(id__in=[11, 22, 33])  # not in


    # contains
    #
    # Tb1.objects.filter(name__contains="ven")
    # Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
    # Tb1.objects.exclude(name__icontains="ven")



    # range
    #
    # Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and


    # 其他类似
    # startswith,istartswith, endswith, iendswith,


    # order by
    # Tb1.objects.filter(name='seven').order_by('id')    # asc
    #Tb1.objects.filter(name='seven').order_by('-id')   # desc
    # limit 、offset


    #可以切片
    # Tb1.objects.all()[10:20]
    # Tb1.objects.first()
    # Tb1.objects.last()


    #获取对象中的某个字段的值  通过values()
    # Tb1.objects.filter(name='seven').values(字段)
    # Tb1.objects.filter(name='seven').values_list(字段1、字段2.····)


    # Tb1.objects.filter(name='seven').distinct()
    # Tb1.objects.all().values(name='seven').distinct()
    # distinct 要和values结合使用,因为只有某些字段重复
    #
    #
    #
    #


    # group by
    from django.db.models import Count, Min, Max, Sum
    # Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
    # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

另外,很多人会问到,在查找时,用get方法和filter方法什么区别,这里简单的说明一下

get方法,返回的结果是一个对象,其结果的表现形式是字典,如果不存在会报错

filter方法,返回的结果是Queryset,实质上就是满足filter条件的对象的集合(不是数据类型的集合),其结果的表现形式是列表,单独更具体的获取其中的对象时可以用下表来操作。

可以用python里思想去理解:

数据库表格其实就是很多个对象组成的群组(类似[ object1, object2,object3, object4,object5, object6 ·········· ] )表格就映射成一个类,里面的每一行记录就是一个对象

用get方法就是获取其中的一个元素,获取的是满足条件的某一个个体,而filter类似于高级函数filter,其结果是筛选出符合条件的一个或多个(至少一个),其得到的结果依然是一个群组概念。

猜你喜欢

转载自blog.csdn.net/weixin_42575020/article/details/81561230