上篇随笔讲了Django使用ORM之单表操作实现出版社的增删查改。
由于出版社和书籍之间是一对多的关系,那么怎么实现一对多的ORM操作数据库增删查改呢。
1、首先在models.py中创建BookInfo类
1 class Book(models.Model): 2 id = models.AutoField(primary_key=True) # 自增的ID主键 3 # 创建一个varchar(64)的唯一的不为空的字段 4 title = models.CharField(max_length=64, null=False, unique=True) 5 # 和出版社关联的外键字段 6 publisher = models.ForeignKey(to="Publisher") 7 8 def __str__(self): 9 return "<Book Object: {}>".format(self.title)
2、在urls.py中添加对应关系
1 # 书相关的对应关系 2 url(r'^book_list/', views.book_list), #展示书籍 3 url(r'^add_book/', views.add_book), # 添加书籍 4 url(r'^delete_book/', views.delete_book), # 删除书籍 5 url(r'^edit_book/', views.edit_book), # 编辑书籍
3、在views.py中编写对应的方法
1 def book_list(request): #展示全部书籍
2 all_book=models.BoolInfo.objects.all() #获取全部的书籍集合
3 return render(request,"Book_List.html",{"all_book":all_book}) #返回Book_List.html页面,并将all_book集合返回到前台页面,返回前台变量名称为all_book
4
5 def add_book(request): #添加书籍
6 if request.method=="POST": #如果页面发过来的为POST请求
7 #print(request.POST)
8 book_name=request.POST.get("bname") #获取新增书籍名称
9 publisher=request.POST.get("publisher") #获取新增书籍的出版社
10 models.BoolInfo.objects.create(title=book_name,publisher_id=publisher) #操作更改数据库
11 return redirect("/book_list/") #重定向返回到书籍列表页面
12 ret = models.Publisher.objects.all() #如果不是POST请求,获取全部的出版社信息展示在书籍列表中
13 return render(request,"Add_Book.html",{"publisher":ret}) #返回添加书籍页面,将全部的出版社信息用变量publisher返回到前端页面
14
15 def delete_book(request): #删除书籍
16 #print(requst.GET.get("id"))
17 book_id=request.GET.get("id") #从前台中获取要删除书籍的id
18 if book_id: #若存在
19 book_obj=models.BoolInfo.objects.get(id=book_id) #获取要删除的书籍对象
20 book_obj.delete() #删除
21 return redirect("/book_list/") #重定向到书籍列表
22 return HttpResponse("要删除的书籍id不存在!")
23
24 def edit_book(request): #修改书籍信息
25
26 if request.method=="POST": #若传过来为POST请求
27 # print(request.POST)
28 new_bname=request.POST.get("bname") #获取请求中新的书籍名称
29 book_id=request.POST.get("bid") #获取新的书籍id
30 new_pid=request.POST.get("publisher") #获取新的书籍出版社id
31
32 book_obj=models.BoolInfo.objects.get(id=book_id) #获取要更改的书籍对象
33 book_obj.title=new_bname #更改要修改的书籍名称
34 book_obj.publisher_id=new_pid #更改要修改的出版社id
35 book_obj.save() #保存更改
36 return redirect("/book_list/") #重定向到书籍列表页面
37 #print(request.GET)
38 edit_id=request.GET.get("id") #若传过来的不是POST请求,为GET,获取要编辑书籍对象的ID
39 book_obj=models.BoolInfo.objects.get(id=edit_id) #获取要编辑的书籍对象
40 ret = models.Publisher.objects.all() #获取全部编辑出版社信息
41 return render(request,"Edit_Book.html",{"publisher":ret,"edit_book":book_obj}) #返回编辑页面,并将要书籍对象和出版社信息返回到前端页面
42 # return HttpResponse("1")
4、编写书籍展示页面
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>书籍列表</title>
6 </head>
7 <body>
8 <h1>所有书籍</h1>
9 <table border="1">
10 <thead>
11 <tr>
12 <th>书籍id</th>
13 <th>书籍名称</th>
14 <th>出版社名称</th>
15 <th>操作</th>
16 </tr>
17 </thead>
18 <tbody>
19 {% for foo in all_book %}
20 <tr>
21 <th>{{foo.id}}</th>
22 <th>{{foo.title}}</th>
23 <th>{{foo.publisher.name}}</th>
24 <th>
25 <a href="/delete_book/?id={{ foo.id }}">删除</a>
26 <a href="/edit_book/?id={{ foo.id }}">编辑</a>
27 </th>
28 </tr>
29 {% endfor %}
30
31 </tbody>
32 </table>
33 <a href="/add_book/">添加书籍</a>
34 </body>
35 </html>
<a href="/delete_book/?id={{ foo.id }}">删除</a> #url中带有要操作对象的id,根据id操作
<a href="/edit_book/?id={{ foo.id }}">编辑</a>
5、编辑新增书籍页面
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>添加书籍</title>
6 </head>
7 <body>
8 <form method="post" action="/add_book/">
9 <p>
10 书籍名称:<input type="text" name="bname">
11 </p>
12 <p>
13 出版社名称: <!--根据出版社的全部信息提供选择对话框-->
14 <select name="publisher">
15 {% for foo in publisher %}
16 <option value="{{foo.id}}">{{ foo.name }}</option>
17 {% endfor %}
18 </select>
19 </p>
20 <p>
21 <input type="submit" value="提交">
22 </p>
23 </form>
24 </body>
25 </html>