创建模型以后,会生成相关的数据库,我们往往会面对对数据库进行基本的操作,下面总结一些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,其结果是筛选出符合条件的一个或多个(至少一个),其得到的结果依然是一个群组概念。