Django-ORM增删改查

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")

 

 

 

 

 

 

 

 

posted @ 2019-03-16 10:15  佛祖让我来巡山  阅读(173)  评论(0编辑  收藏  举报

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网