Django中的模型(操做數據庫)

目錄python

Django配置鏈接數據庫mysql

在Django中操做數據庫sql

原生SQL語句操做數據庫數據庫

ORM模型操做數據庫django

增刪改查api

後臺管理ruby

使用後臺管理數據庫app


模型是數據惟一併且準確的信息來源。它包含您正在儲存的數據的重要字段和行爲。通常來講,每個模型都映射一個數據庫表。性能

Django配置鏈接數據庫

在操做數據庫以前,首先先要鏈接數據庫。這裏咱們以配置 MySQL  爲例來說解。 Django  鏈接數據庫,不須要單獨的建立一個鏈接對象。只須要在 settings.py  文件中的DATABASES配置以下:fetch

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    #數據庫引擎
        'NAME': 'orm',                           #數據庫的名字,這個數據庫得存在
        'USER':'root',                           #數據庫用戶
        'PASSWORD':'root',                       #數據庫密碼
        'HOST':'localhost',                      #鏈接的數據地址
        'PORT':'3306',                           #端口號
    }
}

在Django中操做數據庫

在 Django 中操做數據庫有兩種方式。第一種方式就是使用原生 SQL語句操做,第二種就是使用 ORM模型來操做。

原生SQL語句操做數據庫

在 Django 中使用原生 sql  語句操做其實就是使用 python db api  的接口來操做。若是你的 mysql  驅動使用的是 pymysql  ,那麼你就是使用  pymysql  來操做的,只不過 Django  將數據庫鏈接的這一部分封裝好了,咱們只要在 settings.py  中配置好了數據庫鏈接信息後直接使用 Django  封裝好的接口就能夠操做了。示例代碼以下:

# 使用django封裝好的connection對象,會自動讀取settings.py中數據庫的配置信息
from django.db import connection

cursor = connection.cursor()   # 獲取遊標對象
cursor.execute("select * from book")  # 拿到遊標對象後執行sql語句
rows = cursor.fetchall()  # 獲取全部的數據 
for row in rows:  # 遍歷查詢到的數據
    print(row)

以上的 execute  以及 fetchall  方法都是 Python DB API  規範中定義好的。任何使用 Python  來操做 MySQL  的驅動程序都應該遵循這個規範。因此不論是使用 pymysql  或者是 mysqlclient  或者是 mysqldb  ,他們的接口都是同樣的。

Python DB API下規範下cursor對象經常使用接口

  • description  :若是 cursor  執行了查詢的 sql  代碼。那麼讀取 cursor.description  屬性的時候,將返回一個列表,這個列表中裝的是元組,元組中裝的分別是 (name,type_code,display_size,internal_size,precision,scale,null_ok)  ,其中 name  表明的是查找出來的數據的字段名稱,其餘參數暫時用處不大。
  • rowcount  :表明的是在執行了 sql  語句後受影響的行數。
  • close  :關閉遊標。關閉遊標之後就不再能使用了,不然會拋出異常。
  • execute(sql[,parameters])  :執行某個 sql  語句。若是在執行 sql  語句的時候還須要傳遞參數,那麼能夠傳給 parameters  參數。示例代碼以下:cursor.execute("select * from article where id=%s",(1,))
  • fetchone  :在執行了查詢操做之後,獲取第一條數據。
  • fetchmany(size)  :在執行查詢操做之後,獲取多條數據。具體是多少條要看傳的 size  參數。若是不傳 size  參數,那麼默認是獲取第一條數據。
  • fetchall  :獲取全部知足 sql  語句的數據

ORM模型操做數據庫

ORM  ,全稱 Object Relational Mapping (對象關係映射),經過 ORM  咱們能夠經過類的方式去操做數據庫,而不用再寫原生的SQL語句。經過把表映射成類,把行做實例,把字段做爲屬性, ORM  在執行對象操做的時候最終仍是會把對應的操做轉換爲數據庫原生語句。

  • 每一個模型都是一個 Python 的類,這些類繼承 django.db.models.Model
  • 模型類的每一個屬性都至關於一個數據庫的字段。

綜上訴說,Django 給你一個自動生成訪問數據庫的 API

使用 ORM  有許多優勢:

  • 易用性:使用 ORM  作數據庫的開發能夠有效的減小重複SQL語句的機率,寫出來的模型也更加直觀、清晰。
  • 性能損耗小: ORM  轉換成底層數據庫操做指令確實會有一些開銷。但從實際的狀況來看,這種性能損耗不多(不足5%),只要不是對性能有嚴苛的要求,綜合考慮開發效率、代碼的閱讀性,帶來的好處要遠遠大於性能損耗,並且項目越大做用越明顯。
  • 設計靈活:能夠輕鬆的寫出複雜的查詢。
  • 可移植性: Django  封裝了底層的數據庫實現,支持多個關係數據庫引擎,包括流行的 MySQL  、 PostgreSQL  和 SQLite  ,能夠很是輕鬆的切換數據庫。

建立ORM模型:
ORM  模型通常都是放在 app  的 models.py  文件中。每一個 app  均可以擁有本身的模型。而且若是這個模型想要映射到數據庫中,那麼這個 app  必需要放在 settings.py  的 INSTALLED_APP  中進行安裝。如下是寫一個簡單的 ORM  模型。示例代碼以下:

#models.py文件
from django.db import models
#定義一個Book類,對應於數據庫中的 orm_book 表
class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    author = models.CharField(max_length=20,null=False)
    pub_time = models.DateTimeField(default=datetime.now)
    price = models.FloatField(default=0)

以上便定義了一個模型。這個模型繼承自 django.db.models.Model  ,若是這個模型想要映射到數據庫中,就必須繼承自這個類。這個模型之後映射到數據庫中,表名是模型名稱的小寫形式,爲 book  。在這個表中,有四個字段,一個爲 name  ,這個字段是保存的是書的名稱,是 varchar  類型,最長不能超過20個字符,而且不能爲空。第二個字段是做者名字類型,一樣也是varchar  類型,長度不能超過20個。第三個是出版時間,數據類型是 datetime  類型,默認是保存這本書籍的時間。第四個是這本書的價格,是浮點類型。還有一個字段咱們沒有寫,就是主鍵 id  ,在 django  中,若是一個模型沒有定義主鍵,那麼將會自動生成一個自動增加的 int  類型的主鍵,而且這個主鍵的名字就叫作 id  。 

映射模型到數據庫中:
將 ORM  模型映射到數據庫中,總結起來就是如下幾步:

  1. 在 settings.py  中,配置好 DATABASES  ,作好數據庫相關的配置。
  2. 在 app  中的 models.py  中定義好模型,這個模型必須繼承自 django.db.models  。
  3. 將這個 app  添加到 settings.py  的 INSTALLED_APP  中。
  4. 在命令行終端,進入到項目所在的路徑,而後執行命令 python manage.py makemigrations  來生成遷移腳本文件。
  5. 一樣在命令行中,執行命令 python manage.py migrate  來將遷移腳本文件映射到數據庫中。

能夠看到除了咱們建立的表以外,還有其餘的django默認建立的表

增刪改查

增長

from .models import  Book
from django.http import HttpResponse

#使用ORM添加一條數據到數據庫中
def index(request):
    book=Book(name="西遊記",author="吳承恩",price=100)
    book.save()
    return HttpResponse("添加成功")

#或者這樣
def index(request):
    Book.objects.create(name="西遊記",author="吳承恩",price=100)

#根據主鍵刪除  pk:primary key
book=Book.objects.get(pk=1)
book.delete()
return HttpResponse("刪除成功")

#根據字段刪除
book=Book.objects.filter(name="西遊記")
book.delete()
return HttpResponse("刪除成功")

#根據主鍵修改
book=Book.objects.get(pk=1)
book.price=200
book.save()
return HttpResponse("修改爲功")

#根據主鍵查詢
#books = Book.objects.all()         查詢全部數據
book=Book.objects.get(pk=1)
return HttpResponse(book)   # 返回的是 Book object (3)

#根據字段查詢  使用filter返回的是一個QuserSet對象,這個對象相似於列表,咱們可使用 .[0]來表示第一條數據,以此類推
book=Book.objects.filter(name="西遊記")    
return HttpResponse(book)    # 返回的是 <QuerySet [<Book: Book object (3)>]>

後臺管理

django默認爲咱們建立了後臺管理的頁面

urlpatterns = [
    path('admin/', admin.site.urls),
]

如今咱們要爲django後臺建立一個用戶:python manage.py  createsuperuser

訪問 http://127.0.0.1/admin便可

而後使用剛剛建立的用戶名和密碼登陸便可

使用後臺管理數據庫

咱們在應用下的admin.py中寫入以下:

from django.contrib import admin
from ORM.models import  Book
admin.site.register(Book)

而後再訪問後臺頁面,能夠看到以下。咱們就能夠用後臺頁面管理咱們的數據庫了

相關文章
相關標籤/搜索