写一个简单的项目小例子来了解Django中的O/RM操作

前戏

创建app

#在Django项目根目录下执行
python3 manage.py startapp [app name]

配置数据库连接信息

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 连接的数据库类型'HOST': '127.0.0.1',  # 连接数据库的地址'PORT': 3306,  # 端口'NAME': "testdb",  # 数据库名称'USER': 'root',  # 用户'PASSWORD': 'root'  # 密码
    }
}

/[project name]/settings.py->DATABASES节

让Django用pymysql来代替默认的MySQLdb

import pymysql
pymysql.install_as_MySQLdb()

/[project name]/__init__.py

让项目'知道'APP

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','login_app.apps.LoginAppConfig'
]

/[project name]/settings.py->INSTALLED_APPS节

表关系

代码

创建模型

在app下面的models.py文件中定义类,这些类必须继承models.Model

 1 from django.db import models
 2
 3
 4 class Press(models.Model):
 5     '''
 6     出版社
 7     '''
 8     id = models.AutoField(primary_key=True)
 9     name = models.CharField(max_length=50, unique=True)
10
11
12 class Book(models.Model):
13     '''
14     书籍
15     '''
16     id = models.AutoField(primary_key=True)
17     name = models.CharField(max_length=50, unique=True)
18     press = models.ForeignKey(Press)
19
20
21 class Author(models.Model):
22     '''
23     作者
24     '''
25     id = models.AutoField(primary_key=True)
26     name = models.CharField(max_length=50, unique=True)
27     book = models.ManyToManyField(Book)

/[app name]/models.py

执行命令

python3 manage.py makemigrations # 对比模型和db的差异,记录下将要发生的变更

python3 manage.py migrate # 将记录的变更在数据库中执行

CRUD操作

  • 出版社(一对多)

     1 from django.shortcuts import render, HttpResponse, redirect
     2 from bookapp import models
     3
     4 def add(request):
     5     '''
     6     添加
     7     '''
     8     if request.method == 'POST':
     9         name = request.POST.get('name')
    10         models.Press.objects.create(name=name).save()
    11         return redirect('/list_press/')
    12     return render(request, 'press/add.html')
    13
    14
    15 def list(request):
    16     '''
    17     列表
    18     '''
    19     all_list = models.Press.objects.all()
    20     return render(request, 'press/list.html', {'list': all_list})
    21
    22
    23 def edit(request):
    24     '''
    25     编辑
    26     '''
    27     if request.method == 'POST':
    28         id = request.POST.get('id')
    29         name = request.POST.get('name')
    30         obj = models.Press.objects.get(id=id)
    31         obj.name = name
    32         obj.save()
    33         return redirect('/list_press/')
    34     id = request.GET.get('id')
    35     obj = models.Press.objects.get(id=id)
    36     return render(request, 'press/edit.html', {'press': obj})
    37
    38
    39 def delete(request):
    40     '''
    41     删除
    42     '''
    43     id = request.GET.get('id')
    44     models.Press.objects.get(id=id).delete()
    45     return redirect('/list_press/')

    /[app name]/service/press.py

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>添加出版社</title>
     6 </head>
     7 <body>
     8 <form action="/add_press/" method="post">
     9     <p>名称:<input name="name" type="text"></p>
    10     <p><input type="submit" value="提交"></p>
    11 </form>
    12 </body>
    13 </html>

    /templates/press/add.html 添加出版社页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>出版社列表</title>
     6 </head>
     7 <body>
     8 <a href="/add_press/">添加</a>
     9 <table border="1" style="border-collapse:collapse;">
    10     <tr>
    11         <td>序号</td>
    12         <td>名称</td>
    13         <td>拥有书籍</td>
    14         <td colspan="2">操作</td>
    15     </tr>
    16     {% for press in list %}
    17         <tr>
    18             <td>{{ forloop.counter }}</td>
    19             <td>{{ press.name }}</td>
    20             <td>{% for book in press.book_set.all %}
    21                 {% if forloop.counter == press.book_set.all.count %}
    22                     {{ book.name }}
    23                 {% else %}
    24                     {{ book.name }},
    25                 {% endif %}
    26             {% endfor %}</td>
    27             <td><a href="/edit_press/?id={{ press.id }}">编辑</a></td>
    28             <td><a href="/del_press/?id={{ press.id }}">删除</a></td>
    29         </tr>
    30     {% endfor %}
    31 </table>
    32 </body>
    33 </html>

    /templates/press/list.html 出版社列表页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>修改出版社</title>
     6 </head>
     7 <body>
     8 <form action="/edit_press/" method="post">
     9     <input type="hidden" name="id" value="{{ press.id }}">
    10     <p>名称:<input name="name" type="text" value="{{ press.name }}"></p>
    11     <p><input type="submit" value="提交"></p>
    12 </form>
    13 </body>
    14 </html>

    /templates/press/edit.html 编辑出版社页

  • 书籍(多对一&多对多)

     1 from django.shortcuts import render, HttpResponse, redirect
     2 from bookapp import models
     3
     4
     5 def add(request):
     6     '''
     7     添加
     8     '''
     9     if request.method == 'POST':
    10         press_id = request.POST.get('press_id')
    11         name = request.POST.get('name')
    12         models.Book.objects.create(name=name, press_id=press_id).save()
    13         return redirect('/list_book/')
    14     press_list = models.Press.objects.all()
    15     return render(request, 'book/add.html', {'press_list': press_list})
    16
    17
    18 def list(request):
    19     '''
    20     列表
    21     '''
    22     all_list = models.Book.objects.all()
    23     return render(request, 'book/list.html', {'list': all_list})
    24
    25
    26 def edit(request):
    27     '''
    28     编辑
    29     '''
    30     if request.method == 'POST':
    31         id = request.POST.get('id')
    32         name = request.POST.get('name')
    33         press_id = request.POST.get('press_id')
    34         obj = models.Book.objects.get(id=id)
    35         obj.name = name
    36         obj.press_id = press_id
    37         obj.save()
    38         return redirect('/list_book/')
    39     id = request.GET.get('id')
    40     obj = models.Book.objects.get(id=id)
    41     press_list = models.Press.objects.all()
    42     return render(request, 'book/edit.html', {'book': obj, 'press_list': press_list})
    43
    44
    45 def delete(request):
    46     '''
    47     删除
    48     '''
    49     id = request.GET.get('id')
    50     models.Book.objects.get(id=id).delete()
    51     return redirect('/list_book/')

    /[app name]/service/book.py

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>添加书籍</title>
     6 </head>
     7 <body>
     8 <form action="/add_book/" method="post">
     9     <p>名称:<input name="name" type="text"></p>
    10     <p>出版社: <select name="press_id" >
    11         {% for press in press_list %}
    12         <option value="{{ press.id }}">{{ press.name }}</option>
    13         {% endfor %}
    14     </select></p>
    15     <p><input type="submit" value="提交"></p>
    16 </form>
    17 </body>
    18 </html>

    /templates/book/add.html 添加书籍页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>书籍列表</title>
     6 </head>
     7 <body>
     8 <a href="/add_book/">添加</a>
     9 <table border="1" style="border-collapse:collapse;">
    10     <tr>
    11         <td>序号</td>
    12         <td>名称</td>
    13         <td>出版社</td>
    14         <td colspan="2">操作</td>
    15     </tr>
    16     {% for book in list %}
    17         <tr>
    18             <td>{{ forloop.counter }}</td>
    19             <td>{{ book.name }}</td>
    20             <td>{{ book.press.name }}</td>
    21             <td><a href="/edit_book/?id={{ book.id }}">编辑</a></td>
    22             <td><a href="/del_book/?id={{ book.id }}">删除</a></td>
    23         </tr>
    24     {% endfor %}
    25 </table>
    26 </body>
    27 </html>

    /templates/book/list.html 书籍列表页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>修改书籍</title>
     6 </head>
     7 <body>
     8 <form action="/edit_book/" method="post">
     9     <input type="hidden" name="id" value="{{ book.id }}">
    10     <p>名称:<input name="name" type="text" value="{{ book.name }}"></p>
    11     <p>出版社:
    12         <select name="press_id">
    13             {% for press in press_list %}
    14                 {% if book.press.id == press.id %}
    15                     <option selected value="{{ press.id }}">{{ press.name }}</option>
    16                 {% else %}
    17                     <option value="{{ press.id }}">{{ press.name }}</option>
    18                 {% endif %}
    19             {% endfor %}
    20         </select>
    21     </p>
    22     <p><input type="submit" value="提交"></p>
    23 </form>
    24 </body>
    25 </html>

    /templates/book/edit.html 编辑书籍页

  • 作者(多对多)

     1 from django.shortcuts import render, HttpResponse, redirect
     2 from bookapp import models
     3
     4
     5 def add(request):
     6     '''
     7     添加
     8     '''
     9     if request.method == 'POST':
    10         book_id_list = request.POST.getlist('book_id_list')
    11         print(book_id_list)
    12         name = request.POST.get('name')
    13         author = models.Author.objects.create(name=name)
    14         author.book = book_id_list
    15         author.save()
    16         return redirect('/list_author/')
    17     book_list = models.Book.objects.all()
    18     return render(request, 'author/add.html', {'book_list': book_list})
    19
    20
    21 def list(request):
    22     '''
    23     列表
    24     '''
    25     all_list = models.Author.objects.all()
    26     return render(request, 'author/list.html', {'list': all_list})
    27
    28
    29 def edit(request):
    30     '''
    31     编辑
    32     '''
    33     if request.method == 'POST':
    34         id = request.POST.get('id')
    35         name = request.POST.get('name')
    36         book_id_list = request.POST.getlist('book_id_list')
    37         obj = models.Author.objects.get(id=id)
    38         obj.name = name
    39         obj.book = book_id_list
    40         obj.save()
    41         return redirect('/list_author/')
    42     id = request.GET.get('id')
    43     obj = models.Author.objects.get(id=id)
    44     book_list = models.Book.objects.all()
    45     return render(request, 'author/edit.html', {'author': obj, 'book_list': book_list})
    46
    47
    48 def delete(request):
    49     '''
    50     删除
    51     '''
    52     id = request.GET.get('id')
    53     models.Author.objects.get(id=id).delete()
    54     return redirect('/list_author/')

    /[app name]/service/author.py

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>添加作者</title>
     6 </head>
     7 <body>
     8 <form action="/add_author/" method="post">
     9     <p>姓名:<input name="name" type="text"></p>
    10     <p>拥有书籍: <select name="book_id_list" multiple>
    11         {% for book in book_list %}
    12             <option value="{{ book.id }}">{{ book.name }}</option>
    13         {% endfor %}
    14     </select></p>
    15     <p><input type="submit" value="提交"></p>
    16 </form>
    17 </body>
    18 </html>

    /templates/author/add.html 添加作者页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>作者列表</title>
     6 </head>
     7 <body>
     8 <a href="/add_author/">添加</a>
     9 <table border="1" style="border-collapse:collapse;">
    10     <tr>
    11         <td>序号</td>
    12         <td>姓名</td>
    13         <td>拥有书籍</td>
    14         <td colspan="2">操作</td>
    15     </tr>
    16     {% for author in list %}
    17         <tr>
    18             <td>{{ forloop.counter }}</td>
    19             <td>{{ author.name }}</td>
    20             <td>{% for book in author.book.all %}
    21                 {% if forloop.counter == author.book.count %}
    22                     {{ book.name }}
    23                 {% else %}
    24                     {{ book.name }},
    25                 {% endif %}
    26             {% endfor %}
    27             </td>
    28             <td><a href="/edit_author/?id={{ author.id }}">编辑</a></td>
    29             <td><a href="/del_author/?id={{ author.id }}">删除</a></td>
    30         </tr>
    31     {% endfor %}
    32 </table>
    33 </body>
    34 </html>

    /templates/author/list.html 作者列表页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>修改作者</title>
     6 </head>
     7 <body>
     8 <form action="/edit_author/" method="post">
     9     <input type="hidden" name="id" value="{{ author.id }}">
    10     <p>姓名:<input name="name" type="text" value="{{ author.name }}"></p>
    11     <p>拥有书籍:
    12         <select name="book_id_list" multiple>
    13             {% for book in book_list %}
    14                 {% if book in author.book.all %}
    15                     <option selected value="{{ book.id }}">{{ book.name }}</option>
    16                 {% else %}
    17                     <option value="{{ book.id }}">{{ book.name }}</option>
    18                 {% endif %}
    19             {% endfor %}
    20         </select>
    21     </p>
    22     <p><input type="submit" value="提交"></p>
    23 </form>
    24 </body>
    25 </html>

    /templates/author/edit.html 编辑作者页

配置路由

1 from django.shortcuts import render, HttpResponse, redirect
2 from bookapp.service import press
3 from bookapp.service import book
4 from bookapp.service import author

/[app name]/views.py

 1 from django.conf.urls import url
 2 from django.contrib import admin
 3
 4 from django.conf.urls import url
 5 from bookapp import views
 6 urlpatterns = [
 7     url(r'^add_press/', views.press.add),
 8     url(r'^list_press/', views.press.list),
 9     url(r'^edit_press/', views.press.edit),
10     url(r'^del_press/', views.press.delete),
11     url(r'^add_book/', views.book.add),
12     url(r'^list_book/', views.book.list),
13     url(r'^edit_book/', views.book.edit),
14     url(r'^del_book/', views.book.delete),
15     url(r'^add_author/', views.author.add),
16     url(r'^list_author/', views.author.list),
17     url(r'^edit_author/', views.author.edit),
18     url(r'^del_author/', views.author.delete),
19 ]

/[project name]/urls.py

点击下载完整示例

转载于:https://www.cnblogs.com/zze46/p/10531264.html

python框架之Django(2)-简单的CRUD相关推荐

  1. Python 框架 之 Django MVT 下的 T 的 模板简单介绍和使用

    Python 框架 之 Django MVT 下的 T 的 模板简单介绍和使用 目录

  2. Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用

    Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用 目录

  3. Python 框架 之 Django MVT 下的 M 的 模型的简单介绍和使用

    Python 框架 之 Django MVT 下的 M 的 模型的简单介绍和使用 目录

  4. Python 框架 之 Django 绑定 MySql ,MVT 实现简单一个简单的浏览器(内附详细步骤)

    Python 框架 之 Django 绑定 MySql ,MVT 实现简单一个简单的浏览器(内附详细步骤) 目录

  5. python爬虫框架排行榜-哪种Python框架适合你?简单介绍几种主流Python框架

    众所周知,Python开发框架大大减少了开发者不必要的重复劳动,提高了项目开发效率的同时,还使得创建的程序更加稳定.目前比较主流的Python框架都有哪些呢?一般大家用的比较多的是Django.Fla ...

  6. Python框架:Django写图书管理系统(LMS)

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  7. python框架03 -- Django综述

    简介 主要内容: Django运用.序列化.前后端分离.数据库连接.token头.数据交互 更新: 不定期更新,遇到相关问题则会添加到其中,若有问题请留言或者右下角直接联系 虚拟环境安装 安装 安装p ...

  8. 使用idea搭建ssm框架,并实现简单的CRUD和分页查询功能

    1.使用idea搭建ssm框架步骤,请参考本人博客 2.项目搭建好,创建以下目录 3.在pom.xml文件中引入依赖 <?xml version="1.0" encoding ...

  9. python框架django入门_Python高级进阶(一)Python框架之Django入门

    姓名:{{name}} 爱好: {% for hobby in hobby_list %} {{hobby}}{% endfor %}

最新文章

  1. 服务器系统日志4625,win2008 r2 成千上万的“审核失败”日志 事件ID 4625
  2. php 简单路由实现
  3. Java中的条件编译
  4. Apache Log4j2 RCE 命令执行漏洞预警及修复方案
  5. 赞!超炫的页面切换动画效果【附源码下载】
  6. 开发服务器 VSS开发库 自动备份方案
  7. [转]服务器监控 UptimeRobot 简明使用手册
  8. el-jy-ii计算机组成原理实验报告,EL-JY-II型计算机组成原理实验系统
  9. 邮件归档提升信息价值(上)
  10. DisplayUtils
  11. # AD19规则设置的傻瓜式教程
  12. 织梦的网站地图怎么做html,织梦自带网站地图的生成制作方法详解
  13. 地球经纬度java语言表示_java根据2个经纬度点,计算这2个经纬度点之间的距离(通过经度纬度得到距离)-Go语言中文社区...
  14. web buuctf [BJDCTF2020]Mark loves cat1
  15. 再见了青春,联想Y450最后一次升级,真的神一般存在。
  16. Android硬件开发------计步传感器
  17. 生产者消费者2.0(lock)
  18. strtok、strtok_s、strtok_r 字符串分割函数
  19. Games201学习笔记3:欧拉视角
  20. 【转载】网站关闭了域名备案信息是否需要注销,答案是一定要记得注销域名备案信息

热门文章

  1. Automake十分钟速成教程
  2. 基于ARM的linux嵌入式操作系统
  3. 各类神经网络知识收集
  4. 实验三 图的操作与实现
  5. 看懂堆排序——堆与堆排序(三)
  6. Servlet、Tomcat、 SpringMVC 之间的关系
  7. C语言再学习 -- 详解C++/C 面试题 1
  8. Android adb无线调试脚本
  9. Fcoin Token ( FT )——数字货币交易所的颠覆者,还是无情镰刀的收割者
  10. Mips KVM TrapEmulate implemented in Linux