1. 程式人生 > 其它 >Django——實現增刪改查總結

Django——實現增刪改查總結

技術標籤:Djangodjangopython資料庫MVCmysql

Django實現增刪改查,主要是依賴於models來實現的。下面是一個非常簡單的models.py檔案,該檔案只有一個model,名為Publisher。models.py檔案中每一個類都對應於資料庫中的一張表。

這個類中定義的變數就是資料庫中表的相應欄位。只不過現在Django給我們統一了資料庫的操作,程式開發者無須考慮資料庫語句的操作,也無需考慮是什麼資料庫。因為開發者只需要對model進行操作即可實現增刪改查。

from django.db import models

# Create your models here.


class Publisher(models.Model):
    name = models.CharField(max_length=128)     # 出版社名稱

增加操作

models的增加操作非常簡單,一句話就可以完成。

models.Publisher.objects.create(name="新華出版社")

這樣就給資料庫中和Publisher對應的表中插入了一條資料,並且這條資料欄位name的值是新華出版社。

刪除操作

models的刪除操作也是非常簡單,依舊使用一句話就可以完成。

models.Publisher.objects.filter(name="清華大學出版社").delete()

這樣就刪除了資料庫中和Publisher對應的表中name欄位值為清華大學出版社的資料。

修改操作

修改操作比起前面兩個可能稍微顯得有些複雜。如下:

obj = models.Publisher.objects.get(id=id)    #先查詢
obj.name = name    # 在記憶體中修改
obj.save()         # 將修改儲存到資料庫

你可能會猜到,get方法是查詢,但是你會對get方法中的id欄位存有疑問,明明我們沒有前面的Publisher類中沒有這個變數。那麼為什麼會有這個名為id的欄位呢?這是因為Django的models會自動生成一個主鍵。不信,我給你看看資料庫的欄位,你就明白了。

查詢操作

在前面的修改操作裡已經提到了查詢操作了,其實查詢操作有很多,他們有一些不一樣的地方。前面的刪除操作中有一個方法是filter,它其實也是查詢。她們的區別如下:

obj1 = models.Publisher.objects.get(name="新華出版社")    #返回與所給篩選條件相匹配的物件,返回結果有且只有一個,如果符合篩選條件的物件超過一個或者沒有都會丟擲錯誤。
obj2 = models.Publisher.objects.filter(name="新華出版社") #它包含了與所給篩選條件相匹配的物件,返回的是一個物件,如果查詢不到,那麼返回的是空列表,不報錯。
obj3 =  models.Publisher.objects.filter(name="新華出版社").first()    #返回與之匹配的第一個物件,如果沒有,則返回空。
obj4 = models.Publisher.objects.all()    #獲取表中所有資料

urls.py路由設定

路由設定,其實就是指定前端的請求被哪一個後端API所處理。典型的url如下:

from django.contrib import admin
from django.urls import path
from app01 import views     # 匯入views.py模組
urlpatterns = [
    path('admin/', admin.site.urls),
    path('publisher_list/', views.publisher_list),    # publisher_list/請求被views.py檔案中的publisher_list函式處理
    path('publisher_add/', views.publisher_add),      # publisher_add/請求被views.py檔案中的publisher_add函式處理
    path('publisher_del/', views.publisher_del),      # publisher_del/請求被views.py檔案中的publisher_del函式處理
    path('publisher_edit/', views.publisher_edit),    # publisher_edit/請求被views.py檔案中的publisher_edit函式處理
]

views.py中的後端API

from django.shortcuts import render, redirect
from app01 import models


# Create your views here.


def publisher_list(request):
    obj = models.Publisher.objects.all()  # 獲取所有物件
    return render(request, 'publisher_list.html', {'publisher_list': obj})  # {'publisher_list': obj}是模板,可以傳遞給前端頁面。


def publisher_add(request):
    if request.method == "POST":  # 如果是POST請求
        pub_name = request.POST.get('pub_name')  # 獲取出版社的名稱
        if not pub_name:
            return render(request, 'publisher_add.html', {'error': "出版社名字不能為空"})
        if models.Publisher.objects.filter(name=pub_name):
            return render(request, 'publisher_add.html', {'error': "出版社已經存在"})
        models.Publisher.objects.create(name=pub_name)  # 增加出版社,使用create方法
        return redirect('/publisher_list/')  # 增加完成以後,跳轉到獲取所有出版社頁面
    return render(request, 'publisher_add.html')  # 預設返回增加頁面。


def publisher_del(request):
    pk = request.GET.get('id')  # 獲取URL中id欄位的值
    models.Publisher.objects.filter(id=pk).delete()    # 刪除資料庫中的資料
    return redirect('/publisher_list/')     # 重定向頁面。


def publisher_edit(request):
    id = request.GET.get('id')
    obj1 = models.Publisher.objects.get(id=id)
    if request.method == "GET":
        return render(request, 'publisher_edit.html', {'pub_obj': obj1})
    else:
        name = request.POST.get('pub_name')
        obj2 = models.Publisher.objects.filter(name=name)
        if obj2:
            return render(request, 'publisher_edit.html', {'msg': "該出版社已存在"})
        else:
            obj1.name = name    # 在記憶體中修改
            obj1.save()         # 將修改儲存到資料庫
            return redirect('/publisher_list')  # 重定向到list頁面