写一个简单的项目小例子来了解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. linux CentOS 7 安装 RabbitMQ 3.6.3, Erlang 19.0

    1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixO ...

  2. 【Mybatis】Mybatis元素生命周期

    一.SqlSessionFactoryBuilder SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory的,通过它可以构建多个 ...

  3. 【WEB前端开发最佳实践系列】高可读的HTML

    一.HTML语义化 HTML5中增加了很多标签都是基于此类原则设计的(article   nav  header  footer).页面标签语义化的优点是使得搜索引擎以及第三方抓包工具等更容易读懂页面 ...

  4. JS方法 - 字符串处理函数封装汇总 (更新中...)

    一.计算一段字符串的字节长度 字符串的charCodeAt()方法, 可返回字符串固定位置的字符的Unicode编码,这个返回值是0-65535之间的整数,如果值<=255时为英文,反之为中文. ...

  5. 字符串处理总结之一(C#String类)

    C#(静态String类) C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利.System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字 ...

  6. qcow2、raw、vmdk等镜像格式的比较和基本转换

    注:本文转自http://www.cnblogs.com/feisky/archive/2012/07/03/2575167.html   云计算用一个朋友的话来说:”做云计算最苦逼的就是得时时刻刻为 ...

  7. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

    一.常用的视图 1.会话相关视图 View Description V$PROCESS Contains information about the currently active processe ...

  8. Javascript 变态题解析

    读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了.... 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变 ...

  9. 【转】Windows socket基础

    转自:http://blog.csdn.net/ithzhang/article/details/8448655 Windows socket 基础 Windows socket是一套在Windows ...

  10. 【CF316G3】Good Substrings 后缀自动机

    [CF316G3]Good Substrings 题意:给出n个限制(p,l,r),我们称一个字符串满足一个限制当且仅当这个字符串在p中的出现次数在[l,r]之间.现在想问你S的所有本质不同的子串中, ...