博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django增删改查--图书管理系统
阅读量:4957 次
发布时间:2019-06-12

本文共 13856 字,大约阅读时间需要 46 分钟。

一对一     出版社信息的增删改查

 一对多    出版社信息与书籍信息的增删改查

 多对多    书籍信息与作者信息的增删改查

建表

from django.db import modelsclass Publisher(models.Model):    pid = models.AutoField(primary_key=True)            # 自增字段且设置为主键    name = models.CharField(max_length=32,unique=True)  # 设置唯一    def __str__(self):        return "{}--{}".format(self.pid,self.name)class Book(models.Model):    name = models.CharField(max_length=32,unique=True)    pub = models.ForeignKey('Publisher',on_delete=models.CASCADE)    # 外键  要链接的类名可以直接写,也可以写在字符串内    级联删除class Author(models.Model):    name = models.CharField(max_length=32)    books = models.ManyToManyField('Book')     # 多对多,生成第三张表
orm建表

 

 一对一

 1.设计URL

URL

 

 

 2.写函数

from app01 import modelsdef publisher_list(request):    '''展示数据'''    # 获取数据库内所有出版社的数据    publishers = models.Publisher.objects.all().order_by('pid')      # 获取对象列表并按照pid字段排序    return render(request,'publisher_list.html',{
'publishers':publishers}) # 第三个参数是为了给html文件传值调用def add_publisher(request): '''新增数据''' if request.method == 'POST': # 获取提交的数据(括号内为input的name属性值),没有默认空字符串 new_name = request.POST.get('new_name','').strip() # 设定输入不能为空 if not new_name: return render(request,'add_publisher.html',{
'err_msg':'输入不能为空','name':new_name}) # 设定不能与数据库现有数据重复 obj_list = models.Publisher.objects.filter(name=new_name) # 在数据库中查询数据是否存在 if obj_list: # 数据重复 return render(request, 'add_publisher.html', {
'err_msg': '出版社名称已存在', 'name': new_name}) # orm往数据库中写入数据 if new_name and not obj_list: models.Publisher.objects.create(name=new_name) return redirect('/publisher_list/') # 如果不是post请求,还是返回本页面 return render(request,'add_publisher.html')def delete_publisher(request): '''删除数据''' # 找到需要删除的数据的id pk = request.GET.get('pk') # 通过id在数据库中找到对应的数据 obj = models.Publisher.objects.filter(pid=pk) # 如果数据不存在(通过地址栏指定id进行删除) if not obj: return HttpResponse('要编辑的数据不存在') # 删除数据 返回展示页面 obj.delete() return redirect('/publisher_list/')def edit_publisher(request): # 找到需要编辑的数据的id pk = request.GET.get('pk') # 通过id在数据库中找到对应的数据 对象列表
]> obj_list = models.Publisher.objects.filter(pk=pk) # 如果数据不存在(通过地址栏指定id进行编辑) if not obj_list: return HttpResponse('要编辑的数据不存在') # 拿到数据 1--人民邮电出版社 obj = obj_list[0] err_msg = '' if request.method == 'POST': # 获取用户输入的数据 new_name = request.POST.get('new_name','').strip() # 设定输入不能为空,返回添加页面 if not new_name: err_msg = '输入不能为空' # return render(request, 'edit_publisher.html', {'obj': obj, 'err_msg': '输入不能为空'}) # 设定不能与数据库现有数据重复 obj_list = models.Publisher.objects.filter(name=new_name) # 在数据库中查询数据是否存在 if obj_list: #有重复数据,返回添加页面 err_msg = '出版社名称已存在' # return render(request, 'edit_publisher.html', {'obj': obj, 'err_msg': '出版社名称已存在'}) #修改数据 if new_name and not obj_list: obj.name = new_name # 在内存中修改 obj.save() # 写入数据库 return redirect('/publisher_list/') #跳转到展示页面 return render(request,'edit_publisher.html',{
'obj':obj,'err_msg':err_msg}) return render(request, 'edit_publisher.html')
函数

 

 3.写模板

在模板中    {% 逻辑 %} 表示逻辑        {

{ 变量 }},可以使用函数传的参数进行渲染

    
出版社信息
新增
{
% for foo in publishers %} # 开始循环
{
% endfor %} # 结束循环
序号 ID 名称 操作
{
{ forloop.counter }}
{
{ foo.pk }}
{
{ foo.name }}
删除 编辑
publisher_list

 

    
添加信息
{
{ err_msg }}
add_publisher
    
编辑信息
{
{ err_msg }}
edit_publisher

 

一对多

1.设计URL

from app01 import viewsurlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^publisher_list/', views.publisher_list),    url(r'^add_publisher/', views.add_publisher),    url(r'^delete_publisher/', views.delete_publisher),    url(r'^edit_publisher/', views.edit_publisher),    url(r'^book_list/', views.book_list),    url(r'^add_book/', views.add_book),    url(r'^del_book/', views.del_book),    url(r'^edit_book/', views.edit_book),]
URL对应

 

2.写函数

def book_list(request):    '''书籍数据展示'''    # 将数据库中的数据读取出来    books = models.Book.objects.all()      #对象列表    return render(request,'book_list.html',{
'books':books})def add_book(request): '''添加书籍信息''' # 获取所有出版社信息 publishers = models.Publisher.objects.all() if request.method == 'POST': # 获取提交的数据 new_name = request.POST.get('new_name','').strip() pub_id = request.POST.get('pub_id') err_msg = '' # 不能为空 if not new_name: err_msg = '输入不能为空' # 不能与现有书籍重复 obj = models.Book.objects.filter(name=new_name) if obj: err_msg = '书籍已存在' # 写入数据库 if new_name and not obj: models.Book.objects.create(name=new_name,pub_id=pub_id) # 跳转到展示页面 return redirect('/book_list/') return render(request,'add_book.html',{
'publishers':publishers,'err_msg':err_msg,'new_name':new_name}) # 如果不是post请求 return render(request,'add_book.html',{
'publishers':publishers})def del_book(request): '''删除书籍''' # 获取删除数据的pk pk = request.GET.get('pk') # 根据pk在数据库中找出对应的数据 obj = models.Book.objects.filter(pk=pk) # 如果pk不存在 if not obj: return HttpResponse('要删除的数据不存在') # 删除数据 obj.delete() # 返回展示页面 return redirect('/book_list/')def edit_book(request): '''编辑书籍信息''' # 找到需要编辑数据的pk pk = request.GET.get('pk') #根据pk找到数据库中的对应的数据 obj_list = models.Book.objects.filter(pk=pk) obj = obj_list[0] publishers = models.Publisher.objects.all() if request.method == 'POST': # 获取提交的数据 new_name = request.POST.get('new_name','').strip() pub_id = request.POST.get('pub_id','').strip() err_msg = '' if not new_name: err_msg = '输入不能为空' book_obj = models.Book.objects.filter(name=new_name) if book_obj: err_msg = '书籍已存在' if new_name and not book_obj: obj.name = new_name obj.pub_id = pub_id obj.save() return redirect('/book_list/') return render(request,'edit_book.html',{
'err_msg':err_msg,'obj':obj,'publishers':publishers}) return render(request,'edit_book.html',{
'publishers':publishers,'obj':obj})
函数

 

3.写模板

    
书籍信息
书籍信息
新增
{
% for book in books %}
{
% endfor %}
序号 ID 书名 出版社 操作
{ { forloop.counter }} { { book.pk }} { { book.name }} { { book.pub.name }} 删除 编辑
book_list
    
添加书籍信息
添加书籍信息
{ { err_msg }}
add_book

 

    
编辑书籍信息
编辑书籍信息
{ { err_msg }}
edit_book

 

多对多

1.设计URL

urlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^publisher_list/', views.publisher_list),    url(r'^add_publisher/', views.add_publisher),    url(r'^delete_publisher/', views.delete_publisher),    url(r'^edit_publisher/', views.edit_publisher),    url(r'^book_list/', views.book_list),    url(r'^add_book/', views.add_book),    url(r'^del_book/', views.del_book),    url(r'^edit_book/', views.edit_book),    url(r'^author_list/', views.author_list),    url(r'^add_author/', views.add_author),    url(r'^del_author/', views.del_author),    url(r'^edit_author/', views.edit_author),]
URL对应

 

2.写函数

def author_list(request):    '''展示作者'''    authors = models.Author.objects.all()    # for i in authors:    #     print(i.books)           # 关系管理对象    #     print(i.books.all())     # 关联的书籍对象    return render(request,'author_list.html',{
'authors':authors})def add_author(request): '''新增作者''' if request.method == 'POST': name = request.POST.get('name') book_id = request.POST.getlist('book_id') # get方法只会取一条数据,书籍为多选,使用getlist方法,结果为列表 # 写入数据库,返回展示页面 author_obj = models.Author.objects.create(name=name) # 创建作者对象 author_obj.books.set(book_id) # set方法 设置作者和书籍的多对多的关系 每次都是重新设置.删除原有数据,生成新的id return redirect('/author_list/') books = models.Book.objects.all() return render(request,'add_author.html',{
'books':books})def del_author(request): '''删除作者''' pk = request.GET.get('pk') models.Author.objects.filter(pk=pk).delete() return redirect('/author_list/')def edit_author(request): '''编辑作者''' pk = request.GET.get('pk') edit_obj = models.Author.objects.get(pk=pk) if request.method == 'POST': name = request.POST.get('name') books_id = request.POST.getlist('book_id') edit_obj.name = name edit_obj.save() edit_obj.books.set(books_id) # 修改作者与书籍的多对多关系 return redirect('/author_list/') books = models.Book.objects.all() return render(request,'edit_author.html',{
'obj':edit_obj,'books':books})
函数

 

3.写模板

    
作者信息

作者信息

新增
{
% for author in authors %}
{
% endfor %}
序号 ID 作者 代表作 操作
{ { forloop.counter }} { { author.pk }} { { author.name }} { % for book in author.books.all %} { { book.name }} { % endfor %} 删除 编辑
author_list

 

    
添加作者信息
添加作者信息
{ { err_msg }}
add_author

 

    
修改作者信息
编辑作者信息
edit_author

 

创建多对多关系的三种方式

1.Django创建第三张表

class Author(models.Model):   name = models.CharField(max_length=32)   books = models.ManyToManyField('Book')  # 表示多对多的关系  生成第三张表

 

 

2.自己创建第三张表

  可以在第三张表中添加另外的字段和数据,利用django直接创建是做不到的,但是查询数据比较复杂

class Author(models.Model):   name = models.CharField(max_length=32)class Author_Book(models.Model):   author = models.ForeignKey('Author')   book = models.ForeignKey('Book')   time = models.CharField(max_length=32)

 

 

3.Django + 自建表

  通过Django和自建表的形式,既可以在表中添加字段和数据,也解决了查询困难的事情

class Author(models.Model):    name = models.CharField(max_length=32)    books = models.ManyToManyField('Book',through='Author_Book')  # 表示多对多的关系 class Author_Book(models.Model):   author = models.ForeignKey('Author')   book = models.ForeignKey('Book')   time = models.CharField(max_length=32)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sandy-123/p/10638540.html

你可能感兴趣的文章
执行了的程序,才是你的程序.
查看>>
国内使用Google Maps JavaScript API
查看>>
Linux学习笔记之RedHat Enterprise Linux 6.4 使用 Centos 6 的yum源问题
查看>>
手机之间的“间谍战”-巧用“蓝牙间谍”遥控远程手机
查看>>
PowerDesigner(数据库迁移)
查看>>
SQL查看表结构以及表说明
查看>>
js隐藏显示div
查看>>
message sent to deallocated instance
查看>>
Python基础
查看>>
在AxureRP8中实现广告文字滚动效果
查看>>
Add Microsoft SQL JDBC driver to Maven(转)
查看>>
javaScript 事件流---冒泡 && 捕获
查看>>
原型和继承 constructor、prototype、__proto__
查看>>
html5 返回当前地理位置的坐标点(经纬度)
查看>>
DelayedQueue
查看>>
正则表达
查看>>
面向对象与领域建模
查看>>
jQuery获取CSS样式中的颜色值的问题
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
Sqlite文件在ubunut的查看
查看>>