1. 程式人生 > >Django框架(十:orm操作)

Django框架(十:orm操作)

model.py檔案介紹: model.py這個檔案中定義的model模型,對應的是資料庫中的表及欄位。

操作資料庫的兩個命令: 1.python manage.py makemigrations 作用:收集model.py檔案中發生變化的模型類,執行這個命令,如果出現No change detected,說明django沒有檢測到當前model發生變化 2.python manage.py migrate 作用:將model模型的這些變化(增刪改)同步至資料庫中,因為model對應的就是表和欄位,所以只要是model發生變化,一定要同步至資料庫,保證model和資料庫內容一致。

所以:第二個命令python

manage.py migrate,在專案第一次執行時必須執行,會生成Django框架內建的資料庫到本地。

如何向資料庫中,新增自定義表及相關欄位? 1.定義一個model類,該類宣告欄位。 2.執行上面兩條命令,生成資料庫,表和相應的欄位

class People(models.Model):
    # primary_key=True: 表示一個table表的主鍵,既然pid這個欄位作為主鍵,那麼這個欄位預設帶有一些約束:非空、唯一。
    # AutoField()表示的是一個自動遞增的整數字段,一般用於表示主鍵。如果model中設定了主鍵,那麼表中就採用model設定的主鍵。如果Model沒有設定主鍵,表會自動生成一個id主鍵。
    pid = models.AutoField(primary_key=True)

    # CharFields must define a 'max_length' attribute.
    # max_length:用於設定這個字串的長度。一般範圍在0-255。根據內容長度的大小設定合適的Max_lenght,主要是為了節省記憶體空間。
    user_name = models.CharField(max_length=50)

    # null=True 表示資料庫中的user_height欄位的值可以為空,預設值是False不能為空.
    # 但是null的值會受到default的值的影響,如果一個欄位沒有指定default預設值,那麼Django將default的預設值設定為空字串。空字串也是表示值存在的。
    # Django在載入這些欄位的時候,會依次讀取每一個欄位的預設值default。如果model存在預設值就直接使用,如果model沒有指定預設值,會採用Django內部封裝的預設值(空字串'')。

    # blank=True 表示html頁面中,在填寫這個欄位時是否必須要填寫,True表示頁面中這個欄位的資料可以忽略不寫,False表示頁面中這個欄位的資料必須要填寫。一般這個blank針對的是表單資料。
    user_height = models.IntegerField(null=True, blank=True)

    # null的值對欄位的影響:
    # null=False 空:指的是user_name的值不能為NULL(等價於None),保證user_name的值是存在的,即便是一個空字串也表示值不為空。''也是一個物件。

    class Meta:
        # 預設的表名是:當前app的名稱_模型的名稱.
        db_table = 'people'

modes.py檔案中定義好表之後,在views.py檔案中進行增刪改查等操作

from django.shortcuts import render
# 匯入models.py中設定的類
from .models import People
from django.http import HttpResponse

"""
Django框架的資料庫操作:這裡的資料庫操作並沒有採用原始的sql語句的形式,而是採用了ORM技術實現資料的增刪改查。這裡的ORM指的是物件關係對映(Object Relational Mapping),它是將表與表之間的關係對映為了物件與物件之間的關係,在這裡操作物件就是在操作表。所有表的增刪改查都是基於物件來完成的。
關係型資料庫:多表聯查。表與表之間的關係非常重要,表關係對映變成物件關係對映。

通過這種方式操作資料庫,可以有效的防止SQL語句注入的風險。
insert into;
delete from student;
() values ();
"""

def insert_data(request):
    # 第一種新增資料
    # People.objects.create(user_name='張三', user_height=100)

    # 第二種新增資料
    # p = People(user_name='zs')
    # p.save()

    # 第三種新增資料
    # p = People()
    # p.user_name = '李四'
    # p.user_height = 170
    # p.save()

    # 第四種新增資料
    # 在建立新的資料之前,先查詢資料庫中是否已經存在對應的資料,如果已經存在就不再建立這個物件了。可以起到一定的去重作用。
    People.objects.get_or_create(user_name='lisi', user_height=180)

    return HttpResponse('資料新增成功')

def select_data(request):
    # 資料的查詢
    # 1. 單條資料查詢: get(),引數就是查詢條件,可以是類中的屬性。
    # p = People.objects.get(user_name='lisi')

    # 2. 多條資料查詢:filter(),引數就是查詢條件,查詢結果是一個結果集QuerySet。
    # p = People.objects.filter(user_height=170).first()

    # 3. 查詢所有資料:all(),返回值也是一個結果集QuerySet。
    # p = People.objects.all()

    # return render(request, 'index.html', {'p': p})

    # 資料的修改
    p = People.objects.get(user_name='lisi')
    p.user_height = 80
    p.save()

    # update():引數就是更新的資料。這個函式是更新所有的資料。
    People.objects.update(user_height=180)

    # 資料的刪除
    People.objects.get(user_name='lisi').delete()

    return HttpResponse('資料修改成功!')

Django框架預設的資料庫死sqlite3,如果你需要設定為mysql,可在settings.py檔案中設定,有關引數根據自己的實際情況設定 在這裡插入圖片描述

注意:如果你是轉移資料庫,在之前已經有執行過上面介紹的兩條命令了,在再次執行的時候一定要把migrations目錄下的檔案記錄刪除,再執行,否則將會報錯,因為你之前對資料庫的操作會記錄在裡面,執行時會讀取裡面的記錄。

在這裡插入圖片描述