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

点击下载完整示例

最新文章

  1. Oracle Hints详解
  2. openstack快速封装镜像
  3. Gephi可视化(二)——Gephi Toolkit叫板Prefuse
  4. Windows Server 2016正式版14393英文版ISO镜像下载:_X64FRE_ZH-CN.ISO
  5. 【转】Linux IO实时监控iostat命令详解
  6. vi编辑器常用配置
  7. poj 2245 Lotto
  8. 统一使用GPT分区表,安装MAC 10.10 和 Win8.1 pro双系统
  9. jdk、jre、jvm的关系
  10. WinJS.Binding.List与kendo.data.ObservableArray
  11. Log4Net使用指南(转)
  12. 标准SVD和改进的SVD
  13. 关于Android WebView上传文件的解决方案
  14. 学Java的前景与就业,资深程序员教你怎么开始学Java!
  15. 扫描工具nmap介绍
  16. 新浪短连接API免登陆免认证实例
  17. kinect 深度图与彩色图对齐程序
  18. C语言函数指针与 c#委托和事件对比
  19. file 文件上传,下载,删除
  20. Centos6.6搭建Maven私服

热门文章

  1. 解决3 字节的 UTF-8 序列的字节 3 无效
  2. struts1的配置文件详解
  3. 【Linux】 Centos7 NC探测端口命令
  4. 【大数据系列】基于MapReduce的数据处理 SequenceFile序列化文件
  5. echarts - 特殊需求实现代码汇总之【柱图】篇
  6. 如何快速打开.iso文件(不借助专门的工具)
  7. java(8) HashMap源码
  8. Mysql命令行导入sql数据
  9. 4606: [Apio2008]DNA
  10. Unity3D Animator控制参数和添加事件