9DjangoORM删除数据
删除分为物理删除和逻辑删除,生产中使用逻辑删除的场景比较多
1物理删除:
#物理删除 (venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book >>> b1 = Book.objects.get(id=1) >>> b1.delete() (1, {'bookstore.Book': 1})
解说:
物理删除的方法基本都是两步完成,1拿数据,2执行delete()方法
2逻辑删除
订单内新增一个字段is_active,当字段为False时表示删除,在显示订单所有的页面中只显示is_active=True的内容,当我需要删除某个订单时,我只需要把这个订单的is_active置为False即可!
练习:
现有前端页面如下,给删除按钮添加删除功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1" cellspacing=0 > <tr bgcolor="#d3d3d3"> <th>id</th> <th>title</th> <th>pub</th> <th>price</th> <th>market_price</th> <th>op</th> </tr> {% for book in data_book %} <tr> <td>{{ book.id }}</td> <td>{{ book.title }}</td> <td>{{ book.pub }}</td> <td>{{ book.price }}</td> <td>{{ book.market_price }}</td> <td> <a href="/bookstore/update_book/{{ book.id }}">更新</a> <a href="/bookstore/delete_book?book_id={{ book.id }}">删除</a> </td> </tr> {% endfor %} </table> </body> </html>
1先给表单添加一个新字段is_active,默认设置为True
class Book(models.Model): title = models.CharField("书名",max_length=50,default='',unique=True) pub = models.CharField('出版社', max_length=100, default='') price = models.DecimalField('定价',max_digits=7,decimal_places=2,default=0.0) market_price = models.DecimalField('零售价', max_digits=7,decimal_places=2,default=0.0) info = models.CharField('详情',max_length=100,default='') is_active = models.BooleanField('是否伪删除',default=True) class Meta: db_table = 'book'
python manage.py makemigrations
python manage.py migrate
2将所有获取表单数据的语句添加过滤条件:
#获取所有书籍 def all_book(request): #data_book = Book.objects.all() data_book = Book.objects.filter(is_active=True) return render(request, 'bookstore/all_book.html', locals())
#更新书籍 def update_book(request, book_id): try: book = Book.objects.get(id=book_id,is_active=True) except Exception as e: print('--update book error is %s'%(e)) return HttpResponse('--The book is not existed') if request.method == 'GET': return render(request,'bookstore/update_book.html',locals()) elif request.method == 'POST': #获取 price = request.POST['price'] market_price = request.POST['market_price'] #修改 book.price = price book.market_price = market_price #保存 book.save() return HttpResponseRedirect('/bookstore/all_book')
3编写删除视图逻辑:
先从浏览器请求地址中获取订单id,然后根据订单id和伪删除状态查出数据,最后把数据的为状态置为False并保存数据
#删除 def delete_book(request): book_id = request.GET.get('book_id') if not book_id: return HttpResponse('--请求异常') try: book = Book.objects.get(id=book_id,is_active=True) except Exception as e: print('--delect book get error &s'%(e)) return HttpResponse('---The book id is error') book.is_active = False book.save() return HttpResponseRedirect('/bookstore/all_book')
4根据前端配置的删除链接配置路由:
<a href="/bookstore/delete_book?book_id={{ book.id }}">删除</a>
path('delete_book',views.delete_book)

浙公网安备 33010602011771号