一、概念
对象关系映射(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>
转载于:https://blog.51cto.com/qidian510/2095269