写一个简单的项目小例子来了解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. 怎样在js中使用EL表达式

    相信已经有很多人对如何在js中使用EL表达式存有困惑,各种引号的处理不胜其烦. 1.在js(嵌入jsp页面)中通过定义变量的方式使用EL表达式: 如:var url = '${param.url}'; ...

  2. Windows平台JDK8下载和安装说明

    本页介绍如何安装和卸载Windows的JDK 8. 该页面包含以下主题: “系统要求” “安装说明符号” “安装说明” “卸载JDK” “已安装的目录树” “安装疑难解答” 有关安装JDK 8和JRE ...

  3. 【VI】如何再执行上一个(历史)命令(已解决)

    输入命令提示符( : )+ 上下箭头(<Up/Down>键) 输入 :his 或者 :history 查看历史

  4. python tkinter教程-事件绑定

    一个Tkinter主要跑在mainloop进程里.Events可能来自多个地方,比如按键,鼠标,或是系统事件. Tkinter提供了丰富的方法来处理这些事件.对于每一个控件Widget,你都可以为其绑 ...

  5. Hive学习之数据去重

    insert overwrite table store select t.p_key,t.sort_word from ( select p_key, sort_word , row_number( ...

  6. laravel with 渴求式加载指定字段

    在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的. 这时候我们可以使用 ...

  7. 对Java中使用两个大括号进行初始化的理解

    最近重读Java 编程思想,读到有关实例化代码块儿 的内容,使我对于使用两个大括号进行初始化有了更深的理解. 实例化代码块儿: 和静态代码块儿的概念相对应,静态代码块儿是static 关键字 + 大括 ...

  8. Mysql On Mac OS: Remove & Install

    If you downloaded and installed from .dmg package already, and mightbe sometime it sucks because of ...

  9. 微信小游戏 50M那部分的缓存机制的使用

    一.使用 AssetsManager 灵活定制微信小游戏的缓存策略 官网教程:http://developer.egret.com/cn/github/egret-docs/Engine2D/mini ...

  10. linux安装环境

    我用的是Linux ubuntu 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 ...