• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python django ORM 的增删改查案例记录

武飞扬头像
道牧不会写代码
帮助1

在学习中摸索简单的ORM和模板层html的数据交互中的增删改查功能。

主要和网络教程不同的是我查询用的是fileter去对象,再在html中用for in给对象实例化,再获取对应属性的值,而b站的教程用的是get获取单条数据,能直接.属性取值,两种方法都是能实现效果的,但需要注意用get的方法更新数据最后要用save方法保存,用filter的update就不用save了。

下面开始举例子:

先看html页面:

学新通

urls层 

  1.  
    from django.contrib import admin
  2.  
    from django.urls import path, re_path,include
  3.  
    from . import views
  4.  
     
  5.  
    urlpatterns = [
  6.  
    # 查数据
  7.  
    path('page/01', views.view01),
  8.  
    # 改数据
  9.  
    path('page/01/<int:page>', views.view02),
  10.  
    path('page/01/update_news/<int:page>', views.view02),
  11.  
    # 删数据
  12.  
    path('page/02/<int:page>', views.view03),
  13.  
    # 加数据
  14.  
    path('page/03/<int:page>', views.view04),
  15.  
    path('page/03/add/<int:page>', views.view04),
  16.  
     
  17.  
    ]
学新通

访问主页的views方法:

  1.  
    def view01(request):
  2.  
    all = models.news_inr_test.objects.all()
  3.  
    return render(request, 'news/news.html', locals())

主页的模板html:

  1.  
    只截取表格部分(调用view方法的值的部分):
  2.  
    <table border="1">
  3.  
    <tr>
  4.  
    <th>id</th>
  5.  
    <th>name</th>
  6.  
    <th>time</th>
  7.  
    <th>price</th>
  8.  
    </tr>
  9.  
     
  10.  
    {% for i in all %}
  11.  
    <tr>
  12.  
    <td>{{ i.id }}</td>
  13.  
    <td>{{ i.title }}</td>
  14.  
    <td>{{ i.time }}</td>
  15.  
    <td>{{ i.price}}</td>
  16.  
    <td>
  17.  
    <a href="01/{{ i.id }}">修改</a>
  18.  
    <a href="02/{{ i.id }}">删除</a>
  19.  
    <a href="03/{{ i.id }}">增加</a>
  20.  
    </td>
  21.  
    </tr>
  22.  
    {% endfor %}
  23.  
     
  24.  
    </table>
  25.  
     
  26.  
    需要注意 view01方法的查询是 all = models.news_inr_test.objects.all()
  27.  
    方法的是一个Queey对象 包含所有数据的对象 所以用for in 一个一个取出来
  28.  
     
  29.  
    这里中 a标签中链接 和当前页面拼接了 能访问对应view02方法绑定的url地址
学新通

数据更新和数据增加操作:

因为这两个方法的步骤是类似的,注要是最后获取表格提交的数据进行不同的数据库方法。

  1.  
    以数据增加为案例:
  2.  
    urls中所用的链接:
  3.  
    # 加数据
  4.  
    path('page/03/<int:page>', views.view04),这一条是主页点击增加按钮跳转到表单的页面
  5.  
    path('page/03/add/<int:page>', views.view04),这一条是点击后,模板层表单页面的方法
  6.  
     
  7.  
    views中的方法:
  8.  
    def view04(request,page):
  9.  
    son_page = models.news_inr_test.objects.filter(id=page)
  10.  
     
  11.  
    all = models.news_inr_test.objects.all()
  12.  
    这里对 all这行补充一下,如果你直接重定向回主页,这里可以不加,但如果通过给新页面模板的画就要加油,不然的话主页没有all中数据库数据。
  13.  
     
  14.  
    if request.method=='GET':
  15.  
    return render(request, 'news/add.html', locals())
  16.  
    elif request.method=='POST':
  17.  
    update_id = request.POST['id']
  18.  
    update_title = request.POST['title']
  19.  
    update_time=request.POST['time']
  20.  
    update_price=request.POST['price']
  21.  
    models.news_inr_test.objects.create(id=update_id,title=update_title,time=update_time,price=update_price)
  22.  
    return HttpResponseRedirect('/news/page/01')
  23.  
     
  24.  
    add.html(模板层):
  25.  
    {% for son_page1 in son_page %}
  26.  
    <form action="add/{{ son_page1.id }}" method='POST'>
  27.  
    <p>id <input type="text" name="id" value=""></p>
  28.  
    <p>title <input type="text" name="title" value=""></p>
  29.  
    <p>time <input type="text" name='time' value=""></p>
  30.  
    <p>price <input type="text" name='price' value=""></p>
  31.  
    <input type="submit" value="更新">
  32.  
    </form>
  33.  
    {% endfor %}
  34.  
     
  35.  
    操作过程和方法逻辑分析:
  36.  
    主页点击增加按钮,因为是GET请求,被view 中 if判定去add.html模板的页面,注意看这个html表单中aiton链接,绑定的也是view04方法,只不过因为是表格提交(POST),所以不用占用GET,只走post路线。
  37.  
    只有post表单中action产生post请求,响应view04中post方法,view中通过request.POST获取页面提交的数据,之后用对应ORM方法增加或者更新数据
  38.  
     
  39.  
    增加数据:
  40.  
    models.news_inr_test.objects.create(id=update_id,title=update_title,time=update_time,price=update_price)
  41.  
    修改数据:
  42.  
    son_page.update(time=update_time)
  43.  
    son_page.update(price=update_price)
  44.  
    顺便贴一个删除数据的:
  45.  
    son_page.delete()
  46.  
     
  47.  
    最后,通过重定向回主页(最方便):
  48.  
    return HttpResponseRedirect('/news/page/01')
学新通

删除数据操作就不单独写了,我的方法也是用filter通过页面给的page当id,绑定后生成对象,再直接.delete()删除就行了。

补充一下get和filter的查询内容:

学新通

 学新通

 学新通

 学新通

 学新通

学新通 

 补充说明:这些图用的是一位博主的学习记录,十分感谢他的记录。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibeihe
系列文章
更多 icon
同类精品
更多 icon
继续加载