djang-模型层(model)--添加,查询,修改
上篇帶大家簡單做了一下圖書表的創建、簡單的查看和刪除,今天會先簡單介紹添加和修改,因為添加和修改與刪除一樣都很簡單,本篇會相對多介紹一點單表查詢,大家都知道數據庫中查詢是最重要的一部分,畢竟無論是修改還是刪除等很多操作都是建立在查數據的基礎上。
?
本篇導航:
- 添加
- 單表查詢
- 修改
?
今天所有例子用的延續上篇的數據庫,book表也是延續上篇,接著昨天的建表,刪除等功能擴展其他功能,所以有所疑問的可以先看上篇隨筆:
http://www.cnblogs.com/liluning/p/7729607.html
?
一、添加
1、添加表記錄
1)方式一
book_obj = models.Book(nid=nid,title=title,author=author,publishDate=publishDate,price=price) book_obj.save() # 將數據保存到數據庫2)方式二
#book_obj可以得到返回值 book_obj=models.Book.objects.create(title=title,author=author,publishDate=publishDate,price=price)2、template模版
1)首頁的添加按鈕
<a href="/addBook/"><button class="btn btn-primary">添加書籍</button></a>2)添加頁面的提交表單
<form action="/add/" method="post"> {% csrf_token %} <tr> <td><input type="text" name="title"></td> <td><input type="text" name="author"></td> <td><input type="date" name="publishDate"></td> <td><input type="text" name="price"></td> <td> <button class="btn btn-info">提交</button> </td> </tr> </form>{% csrf_token %}之前說過 安全機制 在post請求中使用
3、url 分發
url(r'^add/', views.addBook),4、視圖函數views
def addBook(request) :if request.method == "POST" : nid = request.POST.get("nid") title = request.POST.get("title") author = request.POST.get("author") publishDate = request.POST.get("publishDate") price = request.POST.get("price") # book_obj = models.Book(title=title,author=author,publishDate=publishDate,price=price) # book_obj.save() # 將數據保存到數據庫 book_obj = models.Book.objects.create(title=title, author=author, publishDate=publishDate, price=price) return redirect("/index/") return render(request, "add.html")先講拿到表單提交的數據 然后添加到表
添加表用那一個方式都可以 推薦方式二
?
二、單表查詢
1、查詢相關API
一定區分object與querySet的區別
?
復制代碼昨天已做介紹: <1> all(): <2> filter():<3> get(): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。(慎用) <4> exclude(): 它包含了與所給篩選條件不匹配的對象 <5> values(): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的并不是一系列model的實例化對象,而是一個可迭代的字典序列 <6> values_list(): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 <7> order_by(): 對查詢結果排序 <8> reverse(): 對查詢結果反向排序 <9> distinct(): 從返回結果中剔除重復紀錄 <10> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 <11> first(): 返回第一條記錄 <12> last(): 返回最后一條記錄 <13> exists(): 如果QuerySet包含數據,就返回True,否則返回False?
?
?
例如: <2>filter(nid=nid,title=title) ','可以起到數據庫and的作用兩個條件關系為且,在括號里并不能實現‘或’的條件關系,后面的隨筆會隨后一一介紹。?
2、雙下劃線之單表查詢
1 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大于1 且 小于10的值 #__lte,__gte 小于等于 大于等于 2 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等于11、22、33的數據 3 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 4 models.Tb1.objects.filter(name__contains="ven") #模糊查詢 5 models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 6 models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and 7 startswith,istartswith, endswith, iendswith3、通過logging可以查看翻譯成的sql語句
LOGGING = {'version': 1,'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }將上面代碼粘貼到setting配置文件里,當你的操作與數據庫相關時 會將我們的寫的語句翻譯成sql語句在服務端打印。
4、以下代碼只為測試sql語句和單表查詢示例
1)url 分發
url(r'^query/', views.query),2)視圖函數views
def query(request):# 查詢方法API:# 1 all: models.表名.objects.all() # book_all = models.Book.objects.all() # 結果是querySet集合 [model對象,....] # print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # 2 filter: models.表名.objects.filter() # 結果是querySet集合 [model對象,....] # ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追風箏的人>, <Book: asd>]> # ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]> # ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]> # print(ret2) # 3 get models.表名.objects.get() # model對象 # ret3=models.Book.objects.get(author="yuan") # print(ret3.price) # exclude : 排除條件 # ret4=models.Book.objects.exclude(author="yuan") # print(ret4) # values方法 # ret=models.Book.objects.filter(author="yuan").values("title","price") # print(ret)# <QuerySet [{'title': '追風箏的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]> # ret = models.Book.objects.filter(author="yuan").values_list("title", "price") # print(ret) # <QuerySet [('追風箏的人', Decimal('99.00')), ('asd', Decimal('123.00'))]> # ret=models.Book.objects.filter(author="yuan").values("author").distinct() # print(ret) # count方法 # ret=models.Book.objects.filter(author="yuan").count() # print(ret) # first 方法 ret = models.Book.objects.all().first() print(ret) # exists方法 # if models.Book.objects.all().exists(): # print("exists") # else: # print("nothing") # ret = models.Book.objects.filter(price__gt=100) # ret = models.Book.objects.filter(price__gte=99) # 大于等于 # ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10) # ret=models.Book.objects.filter(author__startswith="張") # print(ret) return HttpResponse("OK")以 first 方法為例
從此處可以看出我們雖然在操作數據庫時沒有寫sql語句,但是django將我們寫的語句翻譯成了sql語句
?
三、修改
1、修改表記錄
修改表記錄和添加表記錄同樣都有兩個方法,我們在視圖函數views里看修改表記錄的具體應用
nid = request.POST.get("nid") title=request.POST.get("title") author=request.POST.get("author") publishDate=request.POST.get("publishDate") price=request.POST.get("price") # 修改方式1:save(效率低) # book_obj=models.Book.objects.filter(nid=id)[0] # 修改書名示例: # book_obj.title="py2" # book_obj.save() # 修改方式2:(推薦) models.Book.objects.filter(nid=nid).update(title=title,author=author,publishDate=publishDate,price=price) return redirect("/index/")2、url 分發
url(r'^edit/(\d+)', views.editBook),3、template模版
1)主頁修改按鈕
<a href="/edit/{{ book_obj.nid }}"><button class="btn btn-info">編輯</button></a>2)數據來源和添加表數據相同 由template模版的form表單提交 不同的是修改的表單內需要默認原來的數據
<form action="/edit/{{ edit_obj.nid }}" method="post"> {% csrf_token %} <tr> <td>{{ forloop.counter}}<input type="hidden" name="nid" value="{{ edit_obj.nid }}"></td> <td><input type="text" name="title" value="{{ edit_obj.title }}"></td> <td><input type="text" name="author" value="{{ edit_obj.author }}"></td> <td><input type="date" name="publishDate" value="{{ edit_obj.publishDate|date:"Y-m-d" }}"></td> <td><input type="text" name="price" value="{{ edit_obj.price }}"></td> <td> <a href="/del/{{ edit_obj.nid }}"><input type="button" class="btn btn-danger" value="刪除"></a> <button class="btn btn-success">保存</button> </td> </tr> </form>轉載于:https://www.cnblogs.com/52forjie/p/7825239.html
總結
以上是生活随笔為你收集整理的djang-模型层(model)--添加,查询,修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy中的matrix与array的
- 下一篇: python dict常用操作