ORM对单表进行增删改查
一,增加记录
1 #第一种方式 2 b=Book(name="Linux",price=66,author="kelvin",pub_date="2018-12-28") 3 b.save() 4 5 #第二种方式 6 Book.object.create(name="Linux",price=66,author="kelvin",pub_date="2018-12-28")
批量增加
models.Student.objects.bulk_create(objs_list)
有就更新,没有就创建
models.Student.objects.update_or_create(
name='kelvin',
defaults={
'age':38,
}
)
二,修改记录
1 #第一种方式 2 Book.object.filter(id=1),update(pub_date="2019-03-01") 3 4 #第二种方式 5 b=Book.object.get(id=1) #get() 只取出一个对象 6 b.price=888 7 b.save()
注意:在选择对应使用方法时,最好不适用save() 的这种方式,因为save() 方法会把记录的所有字段数据进行修改,即使该字段没有改变也会重新更新数据。
三,删除记录
1 Book.objects.filter(id=1).delete() #筛选指定记录,调用delete()方法
四,查询记录
1 #查询Book表中的所有记录 2 Book.objects.all() 3 4 5 #查询Book表中的指定记录(切片操作) 6 Book.objects.all()[1:3:2] #[起始位置:终止位置:步长] 7 8 9 #查询Book表中的第一条记录 10 Book.objects.first() 11 12 13 #查询Book表中的最后一条记录 14 Book.objects.last() 15 16 17 #查询之get方法 18 Book.objects.get(id=2) #get(筛选条件) 19 #注意:get()方法取到的是一个具体的对象记录,如果记录为空或记录多于一条就报错 20 21 22 #查询filter方法 23 Book.objects.filter(id=2) #filter(筛选条件) 24 #注意:filter() 查询结果均为QuerySet集合,即使集合中就一条数据 25 26 27 #查询Book表中记录的指定字段 28 ret=Book.objects.filter(price>20).values("name","price") 29 #结果:<QuerySet[{"name":"python","price":50},{"name":"Linux","price":88}]> 30 31 ret=Book.objects.filter(price>20).values_list("name","price") 32 #结果:<QuerySet[("python",50),("Linux",88)]> 33 34 35 #查询Book表中记录的指定字段外的记录 36 ret=Book.objects.exclude(price>20).values("name","price") 37 38 ret=Book.objects.exclude(price>20).values_list("name","price") 39 40 #查询结果去重 41 ret=Book.objects.filter(price>20).values("name").distinct() 42 43 #查询结果数量统计 44 ret=Book.objects.filter(price>20).values("name").count()
查询相关的api:
1 # 查询相关API: 2 3 # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 4 5 # <2>all(): 查询所有结果 6 7 # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 8 9 #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()-------- 10 11 # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 12 13 # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 14 15 # <6>order_by(*field): 对查询结果排序 16 17 # <7>reverse(): 对查询结果反向排序 18 19 # <8>distinct(): 从返回结果中剔除重复纪录 20 21 # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 22 23 # <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。 24 25 # <11>first(): 返回第一条记录 26 27 # <12>last(): 返回最后一条记录 28 29 # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False。
惰性机制:
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。
如果想要服务器控制台输出查询对应的sql语句可以在setting中加入:
1 LOGGING = { 2 'version': 1, 3 'disable_existing_loggers': False, 4 'handlers': { 5 'console':{ 6 'level':'DEBUG', 7 'class':'logging.StreamHandler', 8 }, 9 }, 10 'loggers': { 11 'django.db.backends': { 12 'handlers': ['console'], 13 'propagate': True, 14 'level':'DEBUG', 15 }, 16 } 17 } 18 19 LOGGING
四,模糊查询
1 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 2 # 3 # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 4 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 5 # 6 # models.Tb1.objects.filter(name__contains="ven") 7 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 8 # 9 # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 10 # 11 # startswith,istartswith, endswith, iendswith,
ORM对多表进行增删改查(一对多)
一:增加记录
1 #第一种方式 2 Book.objects.create(name="python",price=45,time="2015-12-03",publish_id=2) 3 4 #第二种方式 5 publish_obj=Publish.objects.filter(name="人民出版社")[0] 6 Book.objects.create(name="python",price=45,time="2015-12-03",publish=publish_obj)
二:查询记录
1 #第一种:通过对象(查询人民出版社出版的书籍) 2 #正向查询 3 publish_obj=Publish.objects.filter(name="人民出版社")[0] 4 res=Book.objects.filter(publish=publish_obj).values("name","price") 5 6 #反向查询(根据出版社找所有该出版社出版的书籍) 7 publish_obj=Publish.objects.filter(name="人民出版社")[0] 8 res=publish_obj.book_set.all().values("name","price") 9 10 #第二种:万能的双下划綫(查询人民出版社出版过的书籍) 11 #正向查询 12 res=Book.objects.filter(public__name="人民出版社").values("name") 13 #反向查询 14 res=Publish.objects.filter(name="人民出版社").values("book__name")