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)

 

posted @ 2021-11-29 17:41  linuxTang  阅读(327)  评论(0)    收藏  举报