Django之ORM
阿新 • • 發佈:2018-04-07
Django pymysql一、概念
對象關系映射(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>
Django之ORM