昨天已经初步介绍了怎么把数据库引入到Django的模型当中,那么今天就说说如何在Django中实现对数据库的增删改查
今天的增删改查是针对一个表格进行操作的
今天先上一下实际的代码情况,然后再进行相关的讲解
首先是Django项目下的url.py文件
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^addbook/', views.addbook), url(r'^update/', views.update), url(r'^delete/', views.delete), url(r'^select/', views.delete), ]
app文件下的views文件
fjango.shortcuts import render,HttpResponse frrom dom django.db.models import Avg,Min,Sum,Max,Count from django.db.models import Q,F # Create your views here. from app01.models import * def index(request): return render(request,"index.html") def addbook(request): # Book.objects.create(name="linux运维",price=77,pub_date="2017-12-12",publish_id=2) #publish_obj=Publish.objects.filter(name="人民出版社")[0] #Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj) # book_obj=Book.objects.get(name="python") # print(book_obj.name) # print(book_obj.pub_date) # # #一对多:book_obj.publish--------一定是一个对象 # print(book_obj.publish.name) # print(book_obj.publish.city) # print(type(book_obj.publish)) #查询人民出版社出过的所有书籍名字和价格 #方式一: # pub_obj=Publish.objects.filter(name="人民出版社")[0] # ret=Book.objects.filter(publish=pub_obj).values("name","price") # print(ret) #方式二 # pub_obj = Publish.objects.filter(name="人民出版社")[0] # print(pub_obj.book_set.all().values("name","price")) #print(type(pub_obj.book_set.all())) #方式三 # ret=Book.objects.filter(publish__name="人民出版社").values("name","price") # print(ret) # # python这本书出版社的名字 # ret2=Publish.objects.filter(book__name="python").values("name") # print(ret2) # ret3=Book.objects.filter(name="python").values("publish__name") # print(ret3) # # ret4=Book.objects.filter(publish__city="北京").values("name") # print(ret4) # # ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name") # print(ret5) #通过对象的方式绑定关系 # book_obj=Book.objects.get(id=3) # print(book_obj.authors.all()) # print(type(book_obj.authors.all())) # # author_obj=Author.objects.get(id=2) # print(author_obj.book_set.all()) # book_obj=Book.objects.get(id=3) # author_objs=Author.objects.all() # #book_obj.authors.add(*author_objs) # # book_obj.authors.remove(*author_objs) # book_obj.authors.remove(4) #创建第三张表 # Book_Author.objects.create(book_id=2,author_id=2) # # obj=Book.objects.get(id=2) # print(obj.book_author_set.all()[0].author) #alex出过的书籍名称及价格 # ret=Book.objects.filter(book_author__author__name="alex").values("name","price") # print(ret) # ret2=Book.objects.filter(authors__name="alex").values("name","price","authors__name") # print(ret2) # ret=Book.objects.all().aggregate(Avg("price")) # ret=Book.objects.all().aggregate(Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(Count("price")) # print(ret) # ret=Book.objects.values("authors__name").annotate(Sum("price")) # print(ret) # ret=Publish.objects.values("name").annotate(abc=Min("book__price")) # print(ret) # b=Book.objects.get(name="GO",price=77) # print(b) #Book.objects.all().update(price=F("price")+10) # ret=Book.objects.filter(Q(name__contains="G")) # print(ret) # ret=Book.objects.filter(Q(name="GO"),price=87) # print(ret) #ret=Book.objects.filter(price=200) # for i in ret: # print(i.price) # # Book.objects.all().update(price=200) # ret = Book.objects.filter(price=100) # for i in ret: # print(i.price) # if ret.exists(): # print("ok") # ret=ret.iterator() # print(ret) # # for i in ret: # print(i.name) # # for i in ret: # print(i.name) return HttpResponse("添加成功") def update():pass def delete():pass def select():pass
然后是index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="jquery-3.1.1.js"></script> <title>Title</title> <style> * { margin: 0; padding: 0 } .head{ line-height: 40px; background-color: green; color: white; text-align: center; } </style> </head> <body> <div class="outer"> <div class="head">标题</div> <div class="content"> <a href="/addbook/">添加书籍</a> <a href="/update/">修改书籍</a> <a href="/delete/">删除书籍</a> <a href="/select/">查询书籍</a> </div> <hr> <div class="queryResult"> {% for book in book_list %} <div> <p>{{ book.name }} {{ book.author }} {{ book.price }}</p> </div> {% endfor %} </div> </div> </body> </html>
下面来具体说一下增删改查的实现吧
-------------------------------------增(create , save) -------------------------------
from app01.models import *
#create方式一: Author.objects.create(name='Alvin')
#create方式二: Author.objects.create(**{"name":"alex"})
#save方式一: author=Author(name="alvin")
author.save()
#save方式二: author=Author()
author.name="alvin"
author.save()
-----------------------------------------删(delete) ---------------------------------------------
>>> Book.objects.filter(id=1).delete()
(3, {'app01.Book_authors': 2, 'app01.Book': 1})
我们表面上删除了一条信息,实际却删除了三条,因为我们删除的这本书在Book_authors表中有两条相关信息,这种删除方式就是django默认的级联删除。
-----------------------------------------改(update和save) ----------------------------------------
实例:
注意:
<1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。
<2>在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。
#---------------- update方法直接设定对应属性----------------
models.Book.objects.filter(id=3).update(title="PHP")
##sql:
##UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3; args=('PHP', 3)
#--------------- save方法会将所有属性重新设定一遍,效率低-----------
obj=models.Book.objects.filter(id=3)[0]
obj.title="Python"
obj.save()
# SELECT "app01_book"."id", "app01_book"."title", "app01_book"."price",
# "app01_book"."color", "app01_book"."page_num",
# "app01_book"."publisher_id" FROM "app01_book" WHERE "app01_book"."id" = 3 LIMIT 1;
#
# UPDATE "app01_book" SET "title" = 'Python', "price" = 3333, "color" = 'red', "page_num" = 556,
# "publisher_id" = 1 WHERE "app01_book"."id" = 3;
在这个例子里我们可以看到Django的save()方法更新了不仅仅是title列的值,还有更新了所有的列。 若title以外的列有可能会被其他的进程所改动的情况下,只更改title列显然是更加明智的。更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法,与之等同的SQL语句变得更高效,并且不会引起竞态条件。
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
-----------------------------------------查----------------------------------------
方法比较多,请记住几个关键的filter、get、all、values、order_by
# 查询相关API: # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 # <2>all(): 查询所有结果 # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()-------- # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 # <6>order_by(*field): 对查询结果排序 # <7>reverse(): 对查询结果反向排序 # <8>distinct(): 从返回结果中剔除重复纪录 # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 # <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。 # <11>first(): 返回第一条记录 # <12>last(): 返回最后一条记录 # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False。
然后我们这些语句都是已经用了Django模块语句,所以下面是一个模块,增加在Django项目下的settings文件下,可以同步显示数据库语言是如何操作的。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
LOGGING
嚯嚯,今天内容还是很多的,周末就是好啊。。。。