写一个简单的项目小例子来了解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. 32位win7+vs2008编译mysql 5.6.22源码并安装

    以下这部分安装说明是来自http://www.2cto.com/database/201407/316681.html的win7+vs2010源码编译mysql,文章最后会说明用vs2008编译遇见的 ...

  2. 【抓包分析】 charles + 网易mumu 模拟器数据包

    charles  的使用.我就不再多说了.可以参考以往文章,传送门: https://www.cnblogs.com/richerdyoung/p/8616674.html 此处主要说网易模拟器的使用 ...

  3. Webpack2 升级指南和特性摘要(转)

    Webpack2 升级指南和特性摘要 resolve.root, resolve.fallback, resolve.modulesDirectories 上述三个选项将被合并为一个标准配置项:res ...

  4. Android调试技巧

    转自:http://gityuan.com/2017/07/11/android_debug/ 一. 获取Trace 调用栈信息(Trace)是分析异常经常使用的,这里简单划分两类情况: 当前线程Tr ...

  5. 视频播放效果--video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...

  6. sencha touch 坑爹的Panel,数据不显示了...

    一位同学问我一个问题: sencha touch中xtype创建dataview死活不显示!!版本2.3.1,MVC模式,sencha touch创建目录程序很简单,主界面一个tabPanel,两个分 ...

  7. $@和 $*-linux_Shell

    =================1.问题======= 在使用$@和 $*的时候有时候会混淆. ================2.实践出真知===== 分别用三种参数设置: "a b c ...

  8. 实战BRTSvc一款我见过的最嚣张的挖矿软件

    第一步:发现告警 Suricata发现特征字符串jsonrpc,这个是匹配挖矿木马的一个重要特征.于是开始分析告警信息: 告警中可以提取出的有效信息如下: 目标IP:149.28.199.108 目标 ...

  9. 如何防御mimikatz致敬Mimikatz攻防杂谈学习笔记

    零.绪论:mimikatz简介 mimikatz是一款出色的内网渗透工具,可以抓取windows主机的明文密码.NTLMhash值或者kerberos对应的缓存凭据.mimikatz的使用在获取权限后 ...

  10. 【CF802L】Send the Fool Further! (hard) 高斯消元

    [CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. ...