上篇咱們實現了出版社的增刪改查,出版社數據表有兩個字段id和name,那圖書的表結構怎麼設計呢?圖書也要有一個主鍵id,還要有一個名稱title,是哪一個出版社的,要有個字段press和Press表裏的id對應,這樣圖書就須要三個字段,id,title,presshtml
# 圖書表 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) # 書名 press = models.ForeignKey(to='Press',on_delete=models.CASCADE) # 和出版社表關聯的字段
由於書和出版社是多對一的關係,一個出版社能夠出版多個書,因此外鍵要寫在多的這張表裏面,也就是Book表裏面python
而後執行數據庫
python manage.py makemigrations
python manage.py migrate
說明:to='Press' 默認關聯的是Press下的主鍵,on_delete=models.CASCADE級聯刪除,也就是若是你刪除了出版社,Django會把你這個出版社關聯的書都刪掉。固然你也能夠設置成null或者其餘的默認值,不須要刪除書。Django1.11中,默認就是級聯刪除,Django2.0以後必須指定on_deleteide
to=關聯的表名,默認關聯表裏的主鍵,還有就是咱們的字段是press,可是ORM在操做的時候,會在後面加上_id,在數據庫裏查看字段顯示以下函數
咱們往數據表裏手動加些數據oop
url(r'^book_list/', views.book_list), # 展現圖書列表
在去添加對應的函數post
#獲取圖書列表返回給頁面 def book_list(request): #查詢全部的書籍 data = Book.objects.all() return render(request, 'book_list.html', {"data":data})
添加book_list.html文件url
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖書列表</title> </head> <body> <table border="1"> <thead> <tr> <th>序號</th> <th>書ID</th> <th>書名</th> <th>出版社名</th> </tr> </thead> <tbody> {% for i in data %} <tr> <td>{{ forloop.counter }}</td> <td>{{ i.id }}</td> <td>{{ i.title}}</td> <td>{{ i.press.name }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
說明:spa
#查詢全部的書籍 data = Book.objects.all() #獲取第一本書 first_book = data[0] print(first_book) #Book表的對象 #取到對象的title屬性 print(first_book.title) #取到對象的press屬性 print(first_book.press) # press表的對象 #取到這本書關聯的出版社的名稱 print(first_book.press.name) #取到和我這本書關聯的出版社id,也就是book表裏的press_id print(first_book.press_id) #連表查詢到出版社id print(first_book.press.id)
結果:設計
Book object
python從入門到放棄
Press object
北大出版社
15
15
添加路由
url(r'^add_book/', views.add_book), # 添加圖書
添加函數
#添加圖書 def add_book(request): if request.method == "POST": #獲取用戶填寫的書名 book_title = request.POST.get('book_title') #獲取用戶選擇的出版社id pre_id = request.POST.get('press_id') ''' 基於外鍵對象的建立 press_obj=Press.objects.get(id=press_id) Book.objects.create(title=book_title, press=press_obj) ''' #基於外鍵id值的建立 Book.objects.create(title=book_title, press_id=pre_id) return redirect('/book_list/') data = Press.objects.all() return render(request, 'add_book.html', {"press_id": data})
添加add_book.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加書籍</title> </head> <body> <h1>添加數據</h1> <form action="/add_book/" method="post"> <input type="text" name="book_title"> <select name="press_id"> {% for press in press_id %} <option value="{{ press.id }}">{{ press.name }}</option> {% endfor %} </select> <input type="submit" value="添加"> </form> </body> </html>
在book_list.html裏增長以下代碼
{% for i in data %} <tr> <td>{{ forloop.counter }}</td> <td>{{ i.id }}</td> <td>{{ i.title}}</td> <td>{{ i.press.name }}</td> <td> <a href="/delete_book/?id={{ i.id }}">刪除</a> 這句 </td> </tr> {% endfor %}
添加路由
url(r'^delete_book/', views.delete_book), # 刪除圖書
添加對應的函數
#刪除圖書 def delete_book(request): delete_book_id = request.GET.get('id') Book.objects.filter(id=delete_book_id).delete() return redirect('/book_list/')
添加路由
url(r'^edit_book/', views.edit_book), # 編輯圖書
添加對應的函數
# 編輯圖書 def edit_book(request): # 從url中取到要編輯的書籍的id值 edit_book_id = request.GET.get('id') # 根據id值找到要編輯的書籍對象 edit_book_obj = Book.objects.get(id=edit_book_id) if request.method == 'POST': # 取到用戶修改後的書籍名稱和出版社信息 new_title = request.POST.get('book_title') new_press_id = request.POST.get('press_id') # 修改書籍相應信息 edit_book_obj.title = new_title edit_book_obj.press_id = new_press_id # 保存到數據庫 edit_book_obj.save() return redirect('/book_list/') # 把全部的出版社查詢出來 press_data = Press.objects.all() return render(request,'edit_book.html', {'book_obj':edit_book_obj, 'press_list': press_data})
添加html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯書籍</title> </head> <body> <h1>編輯書籍</h1> <form action="" method="post"> <input type="text" name="book_title" value="{{book_obj.title }}"> <select name="press_id" > {% for press in press_list %} {% if book_obj.press == press %} <option selected value="{{press.id }}">{{ press.name }}</option> {% else %} <option value="{{press.id }}">{{ press.name }}</option> {% endif %} {% endfor %} </select> <input type="submit" value="提交"> </form> </body> </html>
ORM外鍵
press = models.ForignKey(to='Press', on_delete=models.CASCADE)
查詢
1. book_obj.press --> ORM層面封裝的,返回的是和我這本書關聯的出版社對象
2. book_obj.press_id --> 數據庫中真正存在的字段,保存的是和我關聯的出版社id值
編輯
Django模板語言中的if判斷 {% if 條件 %} 知足時執行的語句 {% else %} 不知足時執行的語句 {% endif %}