对象关系映射(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
二、Django中操作MySQL数据库
1. 自己用SQL语句建个数据库
use mysql;
UPDATE user SET password=PASSWORD("123456") WHERE user='root';
FLUSH PRIVILEGES;
create database s20;2、配置连接数据库
setting.py文件中配置连接mysql数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 告诉Django连接数据库的类型
'NAME': 'ceshi', #数据库的库,需要手动在mysql中先建好
'HOST': "127.0.0.1",
'PORT': 3306, # 不要加引号
'USER': "root",
"PASSWORD": "123456", # 要加引号
}
}3、使用pymysql连接MySQL数据库
在__init__.py文件中使用pymysql的功能:
import pymysql
pymysql.install_as_MySQLdb()
4、models.py文件中,根据特定的语法创建类
from django.db import models # Create your models here. class Book(models.Model): # 定义一个自增的ID主键 id = models.AutoField(primary_key=True) # 定义一个最大长度为32的varchar字段 title = models.CharField(max_length=32)
5、执行两个命令
python3 manage.py makemigrations # 记录 app/models.py文件的任何改动 python3 manage.py migrate #把上面的改动翻译成SQL语句,然后去数据库中执行
6、PyCharm连接mysql创建表和删除表




如果要删除表,需要将models.py文件创建的类注销掉即可
from django.db import models # Create your models here. # class Book(models.Model): # # 定义一个自增的ID主键 # id = models.AutoField(primary_key=True) # # 定义一个最大长度为32的varchar字段 # title = models.CharField(max_length=32)
7、数据行操作
>>> from mysite import models (1)数据行增 >>> models.Book.objects.create(title="my life") >>> models.Book.objects.create(title="world") (2)数据行删 >>> models.Book.objects.get(id=2).delete() (3)数据行改 >>> obj = models.Book.objects.get(id=2) >>> obj.title = "my parents" >>> obj.save() (4)数据行查 查单个: >>> obj = models.Book.objects.get(id=2) >>> obj.title 查所有: >>> objs = models.Book.objects.all() >>> objs.title

三、书籍管理系统示例
urls.py文件:
from django.conf.urls import url from django.contrib import admin from mysite import views urlpatterns = [ # 展示书 url(r'^book_list/', views.book_list), # 添加新书 url(r'^add_book/', views.add_book), # 删除书 url(r'delete_book/', views.delete_class), # 编辑书 url(r'edit_book/', views.edit_book) ]
views.py文件:
from django.shortcuts import render
# Create your views here.
from django.shortcuts import HttpResponse, render, redirect
from mysite import models
# 展示书列表的函数
def book_list(request):
# 找到所有的书
books = models.Book.objects.all()
return render(request, "book_list.html", {"book_list": books})
# 添加新书
def add_book(request):
# 如果请求方法是post,表示前端页面填完了正在提交新书的信息
if request.method == "POST":
new_book_name = request.POST.get("book_name")
# 去数据库里面创建新的一本书
models.Book.objects.create(title=new_book_name)
# 跳转回之前展示书籍列表的页面
return redirect("/book_list/")
# 返回一个页面让用户填写新书的相关信息
return render(request, "add_book.html")
# 删除书
def delete_class(request):
# 取到要删除的书的ID,如何从GET(URL)请求中获取数据
delete_id = request.GET.get("id")
# g根据ID值 去数据库中取对应的数据
models.Book.objects.get(id=delete_id).delete() # 找到并删除
return redirect("/book_list/")
# 编辑书
def edit_book(request):
# 如果是post请求,就表明前端页面编辑完了,把新的书信息发过来
if request.method == "POST":
# 取到正在编辑的书的ID
book_id = request.POST.get("book_id")
# 取到编辑之后的书的名字
new_book_title = request.POST.get("book_name")
# 更新书的title
book_obj = models.Book.objects.get(id=book_id)
book_obj.title = new_book_title
# 保存
book_obj.save()
# 跳转回书列表页
return redirect("/book_list/")
# 返回页面让用户编辑书
# 先取到当前编辑的书的ID值
edit_id = request.GET.get("id")
# 根据ID值取出具体的书对象
book = models.Book.objects.get(id=edit_id)
return render(request, "edit_book.html", {"book": book })book_list.html 文件内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<title>书列表</title>
</head>
<body>
<div>
<a href="/add_book/" class="btn btn-success">添加新书</a>
<div class="panel panel-primary">
<div>书籍管理</div>
<div>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>#</th>
<th>书名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book in book_list %}
<tr data-id="{{ book.id }}">
<td>{{ forloop.counter }}</td>
<td>{{ book.title }}</td>
<td>
<a href="/delete_book/?id={{ book.id }}" class="btn btn-danger">删除</a>
<a href="/edit_book/?id={{ book.id }}" class="btn btn-info">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>edit_book.html文件内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<title>添加新书</title>
</head>
<body>
<div style="margin-top: 100px">
<div>
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-primary">
<div>编辑书</div>
<div>
<form action="/edit_book/" method="post">
<input hidden type="text" name="book_id" value="{{ book.id }}">
<div>
<label for="inputbookname" class="col-sm-2 control-label">书籍名称</label>
<div>
<input type="text" id="inputbookname" name="book_name" value="{{ book.title }}">
</div>
</div>
<div>
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">提交修改</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>add_book.html文件内容:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"> <title>添加新书</title> </head> <body> <div style="margin-top: 100px"> <div> <div class="col-md-6 col-md-offset-3"> <div class="panel panel-primary"> <div>添加新书</div> <div> <form action="/add_book/" method="post"> <div> <label for="inputbookname" class="col-sm-2 control-label">书籍名称</label> <div> <input type="text" id="inputbookname" name="book_name"> </div> </div> <div> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default">添加新书</button> </div> </div> </form> </div> </div> </div> </div> </div> </body> </html>
原文地址:http://blog.51cto.com/qidian510/2095269