写一个简单的项目小例子来了解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

 from django.db import models

 class Press(models.Model):
'''
出版社
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True) class Book(models.Model):
'''
书籍
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True)
press = models.ForeignKey(Press) class Author(models.Model):
'''
作者
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True)
book = models.ManyToManyField(Book)

/[app name]/models.py

执行命令

python3 manage.py makemigrations # 对比模型和db的差异,记录下将要发生的变更
python3 manage.py migrate # 将记录的变更在数据库中执行

CRUD操作

  • 出版社(一对多)

     from django.shortcuts import render, HttpResponse, redirect
    from bookapp import models def add(request):
    '''
    添加
    '''
    if request.method == 'POST':
    name = request.POST.get('name')
    models.Press.objects.create(name=name).save()
    return redirect('/list_press/')
    return render(request, 'press/add.html') def list(request):
    '''
    列表
    '''
    all_list = models.Press.objects.all()
    return render(request, 'press/list.html', {'list': all_list}) def edit(request):
    '''
    编辑
    '''
    if request.method == 'POST':
    id = request.POST.get('id')
    name = request.POST.get('name')
    obj = models.Press.objects.get(id=id)
    obj.name = name
    obj.save()
    return redirect('/list_press/')
    id = request.GET.get('id')
    obj = models.Press.objects.get(id=id)
    return render(request, 'press/edit.html', {'press': obj}) def delete(request):
    '''
    删除
    '''
    id = request.GET.get('id')
    models.Press.objects.get(id=id).delete()
    return redirect('/list_press/')

    /[app name]/service/press.py

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>添加出版社</title>
    </head>
    <body>
    <form action="/add_press/" method="post">
    <p>名称:<input name="name" type="text"></p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>出版社列表</title>
    </head>
    <body>
    <a href="/add_press/">添加</a>
    <table border="1" style="border-collapse:collapse;">
    <tr>
    <td>序号</td>
    <td>名称</td>
    <td>拥有书籍</td>
    <td colspan="2">操作</td>
    </tr>
    {% for press in list %}
    <tr>
    <td>{{ forloop.counter }}</td>
    <td>{{ press.name }}</td>
    <td>{% for book in press.book_set.all %}
    {% if forloop.counter == press.book_set.all.count %}
    {{ book.name }}
    {% else %}
    {{ book.name }},
    {% endif %}
    {% endfor %}</td>
    <td><a href="/edit_press/?id={{ press.id }}">编辑</a></td>
    <td><a href="/del_press/?id={{ press.id }}">删除</a></td>
    </tr>
    {% endfor %}
    </table>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>修改出版社</title>
    </head>
    <body>
    <form action="/edit_press/" method="post">
    <input type="hidden" name="id" value="{{ press.id }}">
    <p>名称:<input name="name" type="text" value="{{ press.name }}"></p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

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

     from django.shortcuts import render, HttpResponse, redirect
    from bookapp import models def add(request):
    '''
    添加
    '''
    if request.method == 'POST':
    press_id = request.POST.get('press_id')
    name = request.POST.get('name')
    models.Book.objects.create(name=name, press_id=press_id).save()
    return redirect('/list_book/')
    press_list = models.Press.objects.all()
    return render(request, 'book/add.html', {'press_list': press_list}) def list(request):
    '''
    列表
    '''
    all_list = models.Book.objects.all()
    return render(request, 'book/list.html', {'list': all_list}) def edit(request):
    '''
    编辑
    '''
    if request.method == 'POST':
    id = request.POST.get('id')
    name = request.POST.get('name')
    press_id = request.POST.get('press_id')
    obj = models.Book.objects.get(id=id)
    obj.name = name
    obj.press_id = press_id
    obj.save()
    return redirect('/list_book/')
    id = request.GET.get('id')
    obj = models.Book.objects.get(id=id)
    press_list = models.Press.objects.all()
    return render(request, 'book/edit.html', {'book': obj, 'press_list': press_list}) def delete(request):
    '''
    删除
    '''
    id = request.GET.get('id')
    models.Book.objects.get(id=id).delete()
    return redirect('/list_book/')

    /[app name]/service/book.py

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>添加书籍</title>
    </head>
    <body>
    <form action="/add_book/" method="post">
    <p>名称:<input name="name" type="text"></p>
    <p>出版社: <select name="press_id" >
    {% for press in press_list %}
    <option value="{{ press.id }}">{{ press.name }}</option>
    {% endfor %}
    </select></p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>书籍列表</title>
    </head>
    <body>
    <a href="/add_book/">添加</a>
    <table border="1" style="border-collapse:collapse;">
    <tr>
    <td>序号</td>
    <td>名称</td>
    <td>出版社</td>
    <td colspan="2">操作</td>
    </tr>
    {% for book in list %}
    <tr>
    <td>{{ forloop.counter }}</td>
    <td>{{ book.name }}</td>
    <td>{{ book.press.name }}</td>
    <td><a href="/edit_book/?id={{ book.id }}">编辑</a></td>
    <td><a href="/del_book/?id={{ book.id }}">删除</a></td>
    </tr>
    {% endfor %}
    </table>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>修改书籍</title>
    </head>
    <body>
    <form action="/edit_book/" method="post">
    <input type="hidden" name="id" value="{{ book.id }}">
    <p>名称:<input name="name" type="text" value="{{ book.name }}"></p>
    <p>出版社:
    <select name="press_id">
    {% for press in press_list %}
    {% if book.press.id == press.id %}
    <option selected value="{{ press.id }}">{{ press.name }}</option>
    {% else %}
    <option value="{{ press.id }}">{{ press.name }}</option>
    {% endif %}
    {% endfor %}
    </select>
    </p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

  • 作者(多对多)

     from django.shortcuts import render, HttpResponse, redirect
    from bookapp import models def add(request):
    '''
    添加
    '''
    if request.method == 'POST':
    book_id_list = request.POST.getlist('book_id_list')
    print(book_id_list)
    name = request.POST.get('name')
    author = models.Author.objects.create(name=name)
    author.book = book_id_list
    author.save()
    return redirect('/list_author/')
    book_list = models.Book.objects.all()
    return render(request, 'author/add.html', {'book_list': book_list}) def list(request):
    '''
    列表
    '''
    all_list = models.Author.objects.all()
    return render(request, 'author/list.html', {'list': all_list}) def edit(request):
    '''
    编辑
    '''
    if request.method == 'POST':
    id = request.POST.get('id')
    name = request.POST.get('name')
    book_id_list = request.POST.getlist('book_id_list')
    obj = models.Author.objects.get(id=id)
    obj.name = name
    obj.book = book_id_list
    obj.save()
    return redirect('/list_author/')
    id = request.GET.get('id')
    obj = models.Author.objects.get(id=id)
    book_list = models.Book.objects.all()
    return render(request, 'author/edit.html', {'author': obj, 'book_list': book_list}) def delete(request):
    '''
    删除
    '''
    id = request.GET.get('id')
    models.Author.objects.get(id=id).delete()
    return redirect('/list_author/')

    /[app name]/service/author.py

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>添加作者</title>
    </head>
    <body>
    <form action="/add_author/" method="post">
    <p>姓名:<input name="name" type="text"></p>
    <p>拥有书籍: <select name="book_id_list" multiple>
    {% for book in book_list %}
    <option value="{{ book.id }}">{{ book.name }}</option>
    {% endfor %}
    </select></p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>作者列表</title>
    </head>
    <body>
    <a href="/add_author/">添加</a>
    <table border="1" style="border-collapse:collapse;">
    <tr>
    <td>序号</td>
    <td>姓名</td>
    <td>拥有书籍</td>
    <td colspan="2">操作</td>
    </tr>
    {% for author in list %}
    <tr>
    <td>{{ forloop.counter }}</td>
    <td>{{ author.name }}</td>
    <td>{% for book in author.book.all %}
    {% if forloop.counter == author.book.count %}
    {{ book.name }}
    {% else %}
    {{ book.name }},
    {% endif %}
    {% endfor %}
    </td>
    <td><a href="/edit_author/?id={{ author.id }}">编辑</a></td>
    <td><a href="/del_author/?id={{ author.id }}">删除</a></td>
    </tr>
    {% endfor %}
    </table>
    </body>
    </html>

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

     <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>修改作者</title>
    </head>
    <body>
    <form action="/edit_author/" method="post">
    <input type="hidden" name="id" value="{{ author.id }}">
    <p>姓名:<input name="name" type="text" value="{{ author.name }}"></p>
    <p>拥有书籍:
    <select name="book_id_list" multiple>
    {% for book in book_list %}
    {% if book in author.book.all %}
    <option selected value="{{ book.id }}">{{ book.name }}</option>
    {% else %}
    <option value="{{ book.id }}">{{ book.name }}</option>
    {% endif %}
    {% endfor %}
    </select>
    </p>
    <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

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

配置路由

 from django.shortcuts import render, HttpResponse, redirect
from bookapp.service import press
from bookapp.service import book
from bookapp.service import author

/[app name]/views.py

 from django.conf.urls import url
from django.contrib import admin from django.conf.urls import url
from bookapp import views
urlpatterns = [
url(r'^add_press/', views.press.add),
url(r'^list_press/', views.press.list),
url(r'^edit_press/', views.press.edit),
url(r'^del_press/', views.press.delete),
url(r'^add_book/', views.book.add),
url(r'^list_book/', views.book.list),
url(r'^edit_book/', views.book.edit),
url(r'^del_book/', views.book.delete),
url(r'^add_author/', views.author.add),
url(r'^list_author/', views.author.list),
url(r'^edit_author/', views.author.edit),
url(r'^del_author/', views.author.delete),
]

/[project name]/urls.py

点击下载完整示例

python框架之Django(2)-简单的CRUD的更多相关文章

  1. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  2. 第六篇:web之python框架之django

    python框架之django   python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...

  3. Python框架之Django学习

    当前标签: Django   Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0     Python框架之Django学习笔记(十三) 尛 ...

  4. Python框架之Django的相册组件

    Python框架之Django的相册组件 恩,没错,又是Django,虽然学习笔记已经结贴,但是学习笔记里都是基础的,Django的东西不管怎么说还是很多的,要学习的东西自然不会仅仅用十几篇博文就能学 ...

  5. Python框架之Django学习笔记(十一)

    话说上次说到数据库的基本访问,而数据库我们主要进行的操作就是CRUD,也即是做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete),俗 ...

  6. Python框架之Django学习笔记(十四)

    Django站点管理(续·完) 本想昨天更新的,谁曾想昨天竟然是工作日!我就不吐槽昨天加班到十一点多了,需求增加无疑让我等蛋疼不已,忽而想起一首打油诗: 明月几时有,把酒问群友.不知这次版本,今晚能出 ...

  7. python框架之Django(14)-rest_framework模块

    APIView django原生View post请求 from django.shortcuts import render, HttpResponse from django import vie ...

  8. Python框架之Django学习笔记(十二)

    Django站点管理 十一转眼结束,说好的充电没能顺利开展,反而悠闲的看了电视剧以及去影院看了新上映的<心花路放>.<亲爱的>以及<黄金时代>,说好的劳逸结合现在回 ...

  9. Python框架之Django学习笔记(十)

    又是一周周末,如约学习Django框架.在上一次,介绍了MVC开发模式以及Django自己的MVT开发模式,此次,就从数据处理层Model谈起. 数据库配置 首先,我们需要做些初始配置:我们需要告诉D ...

随机推荐

  1. JSP中的动态包含和静态包含的区别

    本文转载自http://blog.csdn.net/xuxu198899223/article/details/8501044 1. 语法格式 (1)静态包含:<%@ include file= ...

  2. IOS设计模式第十篇之命令行设计模式

    命令行设计模式: 命令设计模式将一个请求或行动作封装为对象.这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面.苹果 苹果公司实现这种模式使用Target-Acti ...

  3. Undeclared identifier:XXX

    未识别错误,是因拼写错误或找不到定义文件. 下面列举一些类型和函数用到的单元. _Stream ADODB_TLB akTop, akLeft, akRight, akBottom Controls ...

  4. python中级---->pymongo存储json数据

    这里面我们介绍一下python中操作mangodb的第三方库pymongo的使用,以及简单的使用requests库作爬虫.人情冷暖正如花开花谢,不如将这种现象,想成一种必然的季节. pymongo的安 ...

  5. Python中四种运行其他程序的方式

    原文地址:http://blog.csdn.net/jerry_1126/article/details/46584179 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在 ...

  6. Android O 获取APK文件权限 Demo案例

    1. 通过 aapt 工具查看 APK权限 C:\Users\zh>adb pull /system/priv-app/Settings . /system/priv-app/Settings/ ...

  7. Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

    相关博客:https://linux.cn/article-3401-1.html 对于那些主要通过控制台或终端使用 Linux 命令行来工作的 Linux 用户来说,他们真切地感受到了 Linux ...

  8. CentOS 安装PostregSQL9.2 同时出现pg安装错误

    错误: Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /usr/local/bin ...

  9. 【BZOJ3413】匹配 离线+后缀树+树状数组

    [BZOJ3413]匹配 Description Input 第一行包含一个整数n(≤100000). 第二行是长度为n的由0到9组成的字符串. 第三行是一个整数m. 接下来m≤5·10行,第i行是一 ...

  10. Spark2 Dataset行列操作和执行计划

    Dataset是一个强类型的特定领域的对象,这种对象可以函数式或者关系操作并行地转换.每个Dataset也有一个被称为一个DataFrame的类型化视图,这种DataFrame是Row类型的Datas ...