对象关系映射(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