1. 程式人生 > >Django之ORM

Django之ORM

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