一,創(chuàng)建一個Django項目
1.1 新建虛擬環(huán)境
? ? ? ? 每一個python項目都創(chuàng)建一個新的虛擬環(huán)境有助于我們對于項目與其所對應包的管理等。
這里使用pycharm工具進行操作演示。
? ? ? ? pycharm左上方找到菜單——File——New Project。
? ? ? ? 點擊后彈出新建項目窗口進行配置
- Location:項目總路徑,選擇一個空的文件夾。
- New environment using:使用什么作為新環(huán)境,選擇Virtualenv虛擬環(huán)境。
- New environment using / Location:虛擬環(huán)境文件夾venv所存放的位置,在選擇了總項目Location后會自動選擇的主項目下的venv文件夾,如果沒有自動選擇需要自行修改。
- Base Interpreter:選擇到電腦中下載的實際python解釋器
- Inherit global site-package:繼承Base Interpreter中的包,建議不要勾選。
- Make available to all projects:其他項目也可以進行使用它的虛擬環(huán)境中的解釋器作為Base Interpreter,建議不要勾選。
- Create a main.py welcome script:創(chuàng)建一個python簡單腳本文件,建議不要勾選,勾選了進去也可以刪除。
? ? ? ? 點擊create,然后彈出一個新窗口,選擇This Window或New Window都可以。
? ? ? ? 然后我們便完成了即將用于django虛擬環(huán)境的初步創(chuàng)建。
二,Django項目的創(chuàng)建與配置?
2.1 安裝配置Django
2.1.1 安裝模塊
? ? ? ? 打開pycharm終端,輸入安裝命令 pip install django,并回車。出現(xiàn)下列頁面便說明安裝完成。
2.1.2 新建django項目?
? ? ? ? 此時我們已經(jīng)安裝好了django模塊,接下來就該新建項目了。依舊是在終端中完成,輸入django-admin.exe startproject mysite(項目名稱)并回車,然后可以在項目路徑下看到我們的主項目mysite,里面還有一個mysite包,這是我們的主應用。還有一個manage.py文件,這是我們除了創(chuàng)建django項目外需要使用的可執(zhí)行文件。具體結構如下圖所示。
- ?manage.py:這是一個命令行工具,用于執(zhí)行各種Django管理任務,如創(chuàng)建數(shù)據(jù)庫、運行開發(fā)服務器、創(chuàng)建超級用戶等。你可以使用它來與Django項目進行交互。
- myproject/settings.py:這是Django項目的主要設置文件??梢栽谶@里配置數(shù)據(jù)庫連接、應用程序設置、模板設置、國際化等。這是項目的核心配置文件。
- myproject/urls.py:這個文件定義了項目的主URL路由,即哪個URL應該由哪個視圖處理。它將URL映射到視圖函數(shù)或類。
- myproject/asgi.py:這是用于異步Web服務器的ASGI(Asynchronous Server Gateway Interface)入口文件。它與WebSocket等異步通信協(xié)議一起使用,用于異步應用程序的部署。(起初不需要過多關注)
- myproject/wsgi.py:這是用于部署Django應用程序的WSGI(Web Server Gateway Interface)入口文件。它允許你將Django應用程序與Web服務器(如Apache或Nginx)集成。(起初不需要過多關注)
- myproject/init.py:這個文件是一個空文件,用于指示Python解釋器將myproject目錄視為Python包。
- myproject/static/:這個目錄用于存儲項目中的靜態(tài)文件,如CSS、JavaScript和圖像。這些文件不會被動態(tài)生成,而是直接提供給瀏覽器。
- myproject/templates/:這個目錄用于存儲項目的HTML模板文件。這些模板通常包含HTML結構和Django模板標記,用于渲染動態(tài)內(nèi)容。
- myproject/apps.py:這個文件定義了Django應用程序的配置,包括應用程序的名稱和其他元數(shù)據(jù)。
- myproject/migrations/:這個目錄包含數(shù)據(jù)庫遷移文件。Django使用遷移來管理數(shù)據(jù)庫模式的變化,使你可以輕松地更新數(shù)據(jù)庫結構。
- myproject/pycache/:這個目錄包含Python編譯的緩存文件,用于提高導入速度。
????????這些文件和目錄是一個標準的Django項目的基本組成部分,可以根據(jù)項目的需要添加其他文件和目錄。它們共同構建了我們的Web應用程序,提供了項目的配置、路由、模板、靜態(tài)文件等功能。通過編輯這些文件,可以定制和擴展我們的Django應用程序。
2.1.3 settings相關簡單配置
? ? ? ? 作為Django項目的主要設置文件。我們可以在這里配置數(shù)據(jù)庫連接、應用程序設置、模板設置、國際化等。這是項目的核心配置文件。接下來會講解一些比較基礎的配置與講解。
- INSTALLED_APPS:應用注冊。當創(chuàng)建一個Django項目時,Django會自動在settings.py文件中生成一個INSTALLED_APPS列表,其中包含了一些默認的應用程序。我們在創(chuàng)建完自己的應用或使用第三方相關應用時都需要在這里進行注冊。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 下方將來會添加自己的應用或第三方模塊應用 ]
-
LANGUAGE_CODE:語言配置。
# LANGUAGE_CODE = 'en-us' 默認語言為英文,改為中文: LANGUAGE_CODE = 'zh-hans'
-
TIME_ZONE:時區(qū)配置。
# TIME_ZONE = 'UTC' 默認時區(qū)為UTC, 改為中國上海:TIME_ZONE = 'Asia/shanghai'
-
DATABASES:數(shù)據(jù)庫配置。Django默認自帶使用sqlite3數(shù)據(jù)庫??梢詫?shù)據(jù)庫修改為mysql或其他django支持的數(shù)據(jù)庫類型。
# 默認的sqlite3數(shù)據(jù)庫 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # 配置為MySQL數(shù)據(jù)庫 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數(shù)據(jù)庫名字', 'USER': '用戶名', 'PASSWORD': '密碼', 'HOST': 主機地址; 'PORT': '3306', } }
-
ROOT_URLCONF:根路由。指向的也就是我們的項目總路由
ROOT_URLCONF = 'mysite.urls'
-
DEBUG:調(diào)試設置。當 DEBUG 設置為 True 時,Django 處于調(diào)試模式。在調(diào)試模式下,如果發(fā)生錯誤,Django 會向用戶顯示詳細的錯誤頁面,包括錯誤消息和代碼跟蹤,這有助于開發(fā)人員識別和解決問題。調(diào)試模式還啟用了一些開發(fā)工具和功能,如自動重新加載代碼、數(shù)據(jù)庫查詢?nèi)罩居涗浀?,有助于開發(fā)過程中的快速迭代和故障排除。但是,在生產(chǎn)環(huán)境中,DEBUG 應設置為 False,以提高安全性。在生產(chǎn)環(huán)境中,不應向終端用戶顯示敏感信息,因此詳細的錯誤頁面和調(diào)試信息應該被禁用。
DEBUG = True
-
ALLOWED_HOST:是一個列表,其中包含允許訪問你的Django應用程序的主機名或IP地址。這是一項重要的安全設置,用于防止跨站請求偽造(CSRF)和其他潛在的安全漏洞。當DEBUG調(diào)試模式為False時,一般將ALLOWED_HOST設置為 ”*“ ,也就是所有地址都可以訪問。
ALLOWED_HOSTS = [] # 當DEBUG=False時需要這樣設置 ALLOWED_HOSTS = ["*"]
-
TEMPLATES:模板文件設置。是 Django 項目中用于存儲HTML模板文件的目錄。'APP_DIRS': True,意思為當前模板文件的搜索位置會從應用下方進行查找,這里建議配置'DIRS':[],也就是指定其他查找路徑,可以設置為BASE_DIR / 'templates'這樣就可以在總路徑下創(chuàng)建一個templates模板文件夾并使用。
# 未配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] # 進行配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # BASE_DIR為項目總路徑,templates可以隨便起名,但是建議約定俗成 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
-
STATIC_URL:用于指定靜態(tài)文件的基本URL。靜態(tài)文件包括CSS、JavaScript、圖像和其他不需要動態(tài)生成的文件。通過設置STATIC_URL,可以告訴Django如何訪問和提供這些靜態(tài)文件。默認也是從應用下進行查找。
# 一般不進行修改,但是會配置新的STATICFILES_DIRS STATIC_URL = 'static/'
-
STATICFILES_DIR:相當于TEMPLATES模板文件中的'DIRS',通過配置可以使django從項目總路徑下進行查找。
# 建議在STATIC_URL附近添加 STATICFILES_DIRS = [BASE_DIR / 'static']
-
MEDIA_URL:用于指定媒體文件的基本URL。媒體文件通常包括用戶上傳的圖像、音頻、視頻等文件。通過設置MEDIA_URL,可以告訴Django如何訪問和提供這些媒體文件。
# 與STATIC_URL設置基本一樣 MEDIA_URL = 'media/'
注意:某些配置在settings中可能沒有,可以進入下載的django包中找到django的配置進行查看。路徑:venv——Lib——site-packages——django——conf——global_settings.py
2.1.4 數(shù)據(jù)遷移
? ? ? ? 注意接下來的命令都要使用manage.py,所有要先cd到自己的項目目錄下才能進行。在django中,在設計了模型類后,需要先生成遷移文件,然后再遷移到數(shù)據(jù)庫這兩步,而django也自帶了幾個應用,在創(chuàng)建完項目后,可以先同步遷移一下數(shù)據(jù)庫。
? ? ? ? 生成遷移文件命令:python manage.py makemigrations
? ? ? ? 遷移到數(shù)據(jù)庫命令:python manage.py migrate
django已經(jīng)生成了遷移文件,所有此時只需在終端中輸入python manage.py migrate便可以完成遷移。
????????此時完成遷移后會發(fā)現(xiàn)在項目路徑下多出一個?db.sqlite3數(shù)據(jù)庫文件,這也就是django默認自帶屬于的數(shù)據(jù)庫,此時可以使用數(shù)據(jù)庫可視化工具進行連接,可以發(fā)現(xiàn)里面已經(jīng)存在了django應用自帶的一些表。
????????而在django-migrations中顯示了django自帶的遷移記錄
?
2.1.5 啟動Django服務?
? ? ? ? 此時完成遷移后,就可以進行Django服務的啟動。依舊是在終端輸入,啟動命令:python manage.py runserver(不指定端口,django會默認啟用8000端口)
? ? ? ? 再點擊http://127.0.0.1:8000/
????????跳轉到此頁面便是已經(jīng)安裝成功。?
2.2 Django自帶的強大后臺? ? ? ?
2.2.1 Admin總路由
? ? ? ? 我們進入總應用下的urls.py后會發(fā)現(xiàn),在urlpatterns(Django 項目中的一個變量,它定義了項目的 URL 路由映射規(guī)則。具體來說,這是一個列表,其中包含了一系列 URL 路由模式(patterns)以及與這些模式關聯(lián)的視圖函數(shù)或類。)中已經(jīng)存在了一個admin路由(一組內(nèi)置的 URL 路由,用于提供管理員界面(后臺管理)功能。這些路由允許管理員用戶對應用程序中的數(shù)據(jù)進行管理,包括創(chuàng)建、讀取、更新和刪除(CRUD)操作,而無需編寫額外的代碼。),此時我們便可以啟動項目后在路徑后拼接上admin便可以進入。
????????但是此時需要賬號密碼才能進入,這是我們就需要創(chuàng)建一個用戶進行登錄后臺,在終端中輸入命令:python manage.py createsuperuser進行創(chuàng)建超級管理員用戶。注冊完成后便可以登錄進入后臺。
?????????此時使用賬號密碼登錄后臺。
????????此時便進入了django的后臺管理 。Django 的 admin 后臺是一個內(nèi)置的管理界面,用于管理和維護?Django 應用程序的數(shù)據(jù)。我們在創(chuàng)建了自己的應用,然后編寫完我們數(shù)據(jù)模型后也可以通過admin.py將自己的數(shù)據(jù)模型注冊到后臺并進行操作與管理。admin后臺主要功能包括:
- 數(shù)據(jù)庫管理: 可以在 admin 后臺中管理應用程序的數(shù)據(jù)模型,查看、添加、編輯和刪除數(shù)據(jù)庫記錄。這包括對數(shù)據(jù)摩西模型(例如用戶、文章、評論、產(chǎn)品等)執(zhí)行基本的 CRUD(創(chuàng)建、讀取、更新、刪除)操作。
- 用戶和權限管理: admin 后臺允許管理用戶,包括創(chuàng)建和編輯用戶帳戶、設置用戶權限、重置密碼等??梢詣?chuàng)建超級用戶,并且可以訪問 admin 后臺以執(zhí)行高級管理任務。
- 可自定義性: 可以自定義 admin 后臺的外觀和行為??梢蕴砑幼远x視圖、自定義模型管理器、自定義表單等,以適應項目需求。這樣可以擴展 admin 后臺的功能,使其滿足項目的具體要求。
- 日志和歷史記錄: admin 后臺記錄了對數(shù)據(jù)庫的所有更改,包括添加、編輯和刪除記錄的操作。這有助于審計和追蹤數(shù)據(jù)變更。
- 多語言支持: admin 后臺支持多語言,允許創(chuàng)建多語言管理界面,以便多語言團隊協(xié)作。
- 快速開發(fā)和原型設計: admin 后臺提供了一個快速原型設計應用程序的方式。在初期開發(fā)階段,可以使用 admin 后臺來快速添加和管理數(shù)據(jù),而不必為前端界面編寫代碼。
- 安全性: admin 后臺是有權限控制的,只有經(jīng)過身份驗證的管理員用戶才能訪問它。可以設置用戶權限以限制其他用戶的操作,以確保安全性。
總之,Django 的 admin 后臺是一個強大的工具,用于簡化管理應用程序的數(shù)據(jù)和用戶。它使開發(fā)人員能夠快速查看和操作數(shù)據(jù)庫記錄,同時提供了可自定義性以適應不同項目的需求。這使得開發(fā)、測試和維護 Django 應用程序變得更加便捷和高效。
2.2.2 數(shù)據(jù)庫與后臺的對應
? ? ? ? 其實在數(shù)據(jù)庫中,我們也可以找到數(shù)據(jù)庫與后臺之間的對應關系,比如我們在創(chuàng)建了一個用戶后,就可以在auth_user表中找到我們創(chuàng)建的對應用戶信息,也可以在后臺進行修改等操作。
三,創(chuàng)建應用
3.1 自己的應用
? ? ? ? 我們在上方一直在講解創(chuàng)建項目時自帶的主應用,接下來我們就要開始創(chuàng)建自己的應用了。
3.1.1 應用的創(chuàng)建
? ? ? ? 首先,還是在命令行輸入命令:python manage.py startapp news(應用名),然后回車。然后便可以看到項目路徑下多了一個名為news的應用。總結構如下:
- 應用目錄(例如,myapp/): 這是自定義應用程序的根目錄,包含了該應用程序的所有文件和子目錄。
- myapp/__init__.py: 這是一個空文件,用于告訴 Python 解釋器將 myapp 目錄視為一個 Python 包。
- myapp/admin.py: 在這個文件中,你可以注冊模型以在 Django 的 admin 后臺中進行管理。通過在這里添加適當?shù)拇a,可以控制哪些模型可以在 admin 后臺中編輯、查看和刪除。
- myapp/apps.py: 這個文件包含有關應用程序的元數(shù)據(jù),如應用程序的名稱和配置。通常,不需要修改此文件,除非需要自定義應用程序的配置。
- myapp/models.py: 在這個文件中,可以定義應用程序的數(shù)據(jù)模型(數(shù)據(jù)庫表)。使用 Django 的模型類來創(chuàng)建數(shù)據(jù)庫表,以及字段來定義表的結構。這是自己創(chuàng)建的應用程序中最重要的文件之一,因為它定義了數(shù)據(jù)的結構。
- myapp/views.py: 這個文件包含了應用程序的視圖函數(shù)或類。視圖定義了如何處理來自客戶端的請求并返回響應??梢栽谶@里編寫業(yè)務邏輯,將請求與模型交互,并渲染模板來生成響應。
- myapp/tests.py: 在這個文件中,可以編寫測試用例來測試應用程序。Django 提供了內(nèi)置的測試框架,可以幫助編寫和運行測試。
- myapp/templates/: 這個目錄用于存儲應用程序的 HTML 模板文件。模板文件包含了應用程序的頁面結構和顯示邏輯。Django 使用模板引擎來渲染這些模板,生成最終的 HTML 響應。
- myapp/static/: 這個目錄用于存儲應用程序的靜態(tài)文件,如 CSS、JavaScript 和圖像。這些文件不會被動態(tài)生成,而是直接提供給瀏覽器。
- myapp/urls/:這個文件剛創(chuàng)建還沒有,但是可以一般來說每一個自己創(chuàng)建的應用下都會創(chuàng)建一個urls來保存本應用的路由,然后最后使用include()函數(shù)連接到總路由。
- myapp/migrations/:應用下的 migrations 包包含了數(shù)據(jù)庫遷移文件,用于管理應用程序的數(shù)據(jù)模型(數(shù)據(jù)庫表結構)的變化。每當更改數(shù)據(jù)模型(例如,添加新字段、修改字段類型、刪除字段等),Django 就會生成一個新的遷移文件,以記錄這些變化。這些遷移文件存儲在應用程序的 migrations 包中。
3.1.2 應用的注冊
? ? ? ? 在創(chuàng)建完自己應用的第一步,就是在總應用的settings中進行注冊。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 下方將來會添加自己的應用或第三方模塊應用
# 將剛才創(chuàng)建的應用進行注冊
'news',
]
3.2 路由的創(chuàng)建
3.2.1 加入路由
????????在總路由中加入自己的應用路由并在自己應用下創(chuàng)建一個路由文件:urls.py
from django.contrib import admin
# 導入include
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 加入自己應用的路由,兩種方法都可以,第二個是命名空間寫法
#,可以在后續(xù)使路由,視圖函數(shù)與模板文件路徑設置更加簡便,這里先默認使用第一種
# 注意include的第一個參數(shù)約定俗成就是自己應用下的urls,然后在自己應用下進行新建urls.py文件
path('news/', include("news.urls")),
# path('news/', include("news.urls", namespace="news"))
]
? ? ? ? 在自己應用下的urls中寫入自己的路由。這里第一個視圖命名為index,切記視圖名后必須有“/”,也可以不填寫視圖名”index/“,這樣進入應用路由后會自動進入index視圖函數(shù)。
from django.urls import path, include
# 默認在views中進行編寫視圖函數(shù)
from .views import *
urlpatterns = [
# 本應用下的路由,第一個參數(shù)是路由名,第二個參數(shù)是視圖函數(shù)名,也可以有第三個參數(shù),
# 也就是命名空間,name=index(一般三個都與視圖函數(shù)名一致)
path("index/", index)
path("index/", index, name="index")
]
3.2.2 編寫視圖函數(shù)
????????接下來就可以到 應用下的views中進行編寫視圖函數(shù).這里面HttpResponse是一個用于測試的視圖常用函,每一個視圖函數(shù)都必須有一個形參名為request,在后面會有大用。
# 先導入HttpResponse進行測試
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# 這里返回使用HttpResponse進行測試(只能輸出一句話)
return HttpResponse("歡迎來到首頁")
3.2.3 測試結果
? ? ? ? 然后便可以啟動服務,進入網(wǎng)站后發(fā)現(xiàn)已經(jīng)不是啟動成功,而是page not found,也就是404畫面
?????????可以看到這里由于我們設置了debug=True,所以會有下面都有哪些視圖的提醒,在后面拼接news/再回車
? ? ? ? 這里可以看到news/后還有一個index/視圖,也就是我們剛才在應用下加入的視圖和剛才編寫的index視圖函數(shù),再在后面拼接上index/,再次回車
? ? ? ? 此時便可以看到,我們剛才編寫的index函數(shù)中的HttpResponse的返回結果。 當然使用HttpResponse這只是作為測試,后續(xù)在開發(fā)中用的多的還是render()函數(shù)
3.3 模型的創(chuàng)建
3.3.1 編寫模型類
? ? ? ??在我們自己創(chuàng)建的應用程序的 models.py 文件中,可以定義應用程序的數(shù)據(jù)模型,這些數(shù)據(jù)模型將映射到數(shù)據(jù)庫表。數(shù)據(jù)模型定義了表的結構以及表中的字段。每個模型類通常都是一個 Python 類,它繼承自 Django 的 models.Model 類,并定義了模型的字段和屬性。接下來是一個簡單的模型類的創(chuàng)建。
from django.db import models
# Create your models here.
# 創(chuàng)建我們新聞中的第一個類:新聞種類Category,繼承models.Model
class Category(models.Model):
# 類屬性,通常需要寫入到類的初始化init方法中的,在這里因為繼承了models.Model,可以直接進行編寫
# 使用的CharField字段也就對應著數(shù)據(jù)庫中的varchar等字段
# max_length最大長度必須要指明,verbose_name是在網(wǎng)站上的展示名,可選
name = models.CharField(max_length=20, verbose_name="新聞種類")
# __str__方法定義了模型的字符串表示,通常在在管理界面中顯示模型的對象時使用。
def __str__(self):
return self.name
# 創(chuàng)建我們新聞中的第二個類:新聞News,同樣繼承models.Model
class News(models.Model):
# 新聞標題,同樣使用CharField字段,這里由于不能重復,需要使用unique唯一約束
title = models.CharField(max_length=10, verbose_name="標題", unique=True)
# 新聞正文,這里使用長文本,未來在使用第三方富文本插件后可以進行更改
content = models.TextField(verbose_name="新聞正文")
# 時間,使用DateTimeField字段,auto_now_add=True可以自動添加新聞添加時的時間,不用手動添加
time = models.DateTimeField(auto_now_add=True, verbose_name="時間")
# 新聞種類,聯(lián)系到Category表,所以使用ForeignKey外鍵,on_delete=models.CASCADE為級聯(lián)刪除
category = models.ForeignKey(to="Category", on_delete=models.CASCADE)
????????還有很多其他字段和參數(shù),包括第三方可以使用的富文本插件等等,在后續(xù)會做詳細解釋。?
3.3.2 生成遷移文件
? ? ? ? 每次在定義完模型類后,還需要同步到數(shù)據(jù)庫,這時需要先生成遷移文件,命令同上,為:python manage.py makemigrations,輸入完后按下回車,會發(fā)現(xiàn)提醒生成了兩張表(一個模型類就對應了一張表)和一個遷移文件
?
? ? ? ? 我們再進入應用下的migrations包中,會發(fā)現(xiàn)多了一個0001_initial.py文件,這就是我們的第一個遷移文件。
3.3.3 遷移到數(shù)據(jù)庫?
? ? ? ? 我們剛才只是生成了遷移文件,還沒有同步到數(shù)據(jù)庫,這里需要再次遷移,才能將模型類同步到數(shù)據(jù)庫中,生成對應的表。命令為:python manage.py migrate。在命令行輸入后按下回車。然后會顯示遷移完成。
????????再次打開數(shù)據(jù)庫查看。 發(fā)現(xiàn)會多出剛才創(chuàng)建的兩個新表。
3.3.4 修改字段或創(chuàng)建新的模型類
????????需要注意,我們每次在models.py中增加新的模型類或者修改其中字段時都需要重新生成遷移文件并向數(shù)據(jù)庫進行重新遷移,但是如果是修改類似于verbose_name或類的__str__字符串表示,是不需要重新生成遷移的。這里將會展示增加新的字段或新的模型類(新表)時遇到的問題。
增加新的模型類
? ? ? ??在models.py中加入一個測試模型類:
# 用于測試的模型類
class Test(models.Model):
test = models.CharField(max_length=10)
? ? ? ??然后需要重新生成遷移文件:python manage.py makemigrations。然后會發(fā)現(xiàn)在migrations中多出一個遷移文件。
? ? ? ? 再次遷移到數(shù)據(jù)庫:python manage.py migrate。此時便同步到了數(shù)據(jù)庫中。同步成功如下:
向已存在的表中增加新的字段
? ? ? ??向剛才的test模型類中再次添加新的字段
# 用于測試的模型類
class Test(models.Model):
test = models.CharField(max_length=10)
# 測試字段
test2 = models.CharField(max_length=20)
? ? ? ? ?再次生成遷移文件:python manage.py makemigrations。此時會發(fā)現(xiàn),提示報錯說缺少一個默認值。
????????
????????這個錯誤消息是由于嘗試向數(shù)據(jù)庫表中添加一個非空字段而沒有指定默認值,但是已經(jīng)存在的行需要一個默認值以進行填充。Django 提供了兩種選項來解決這個問題,可以根據(jù)需求選擇其中一種:
1,提供一個一次性默認值(Provide a one-off default now): 如果希望添加的新字段有一個默認值,并且希望將這個默認值應用于已存在的數(shù)據(jù)庫記錄,可以選擇這個選項。Django 將要求我們輸入默認值,然后將此默認值應用于所有現(xiàn)有的記錄。
2,手動在 models.py 中定義默認值(Quit and manually define a default value in models.py): 如果希望在模型的字段定義中明確指定默認值,而不是在遷移過程中提供一次性默認值,可以選擇這個選項。這意味著需要返回到你的模型類(models.py)中,為新字段指定一個默認值,然后再次運行 makemigrations 命令生成遷移文件。
????????這里建議都選擇第二個選項。
- 按下選項二
- 回到models.py中找到剛才添加的字段,加入default默認值參數(shù)
# 用于測試的模型類 class Test(models.Model): test = models.CharField(max_length=10) # 測試字段 test2 = models.CharField(max_length=20, default="默認")
- 重新生成遷移文件,應該沒有再報錯
- 重新遷移,也沒有報錯
????????當然這里再介紹兩個好用但是不太推薦的方法,在項目應用創(chuàng)建的初期,可以使用,但是數(shù)據(jù)多了之后建議使用Git等版本控制軟件?
直接刪除所有遷移文件和數(shù)據(jù)庫
? ? ? ? 這是最簡單粗暴的一種方法,先刪除我們應用下migrations中的所有遷移文件和sqlite3數(shù)據(jù)庫(如果使用的MySQL等在MySQL中進行操作):
在刪除成功后,重新生成遷移文件:?python manage.py makemigrations
然后重新進行遷移:python manage.py migrate
此時便相當于直接初始化重新生成了數(shù)據(jù)庫與數(shù)據(jù)庫中的表
刪除遷移文件,遷移記錄和表
? ? ? ? 這一種方法不會刪除數(shù)據(jù)庫,但是要更加麻煩一些
刪除遷移文件,數(shù)據(jù)庫中的遷移記錄(在數(shù)據(jù)庫中的django_migrations表中,需要注意這里由于剛才同步將django自帶應用和我們的應用一起進行了遷移,所有這里需要小心不要刪除django自帶的遷移記錄,需要找到自己的應用的遷移記錄)和數(shù)據(jù)庫中我們應用的數(shù)據(jù)表
- 重新生成遷移文件:python manage.py makemigrations
- 重新遷移:python manage.py migrate
四,命令講解
4.1 django-admin
- django-admin 是全局安裝的 Django 命令行工具,它可以在任何地方運行,不僅限于項目的根目錄。
- 可以使用 django-admin 來創(chuàng)建新的 Django 項目,執(zhí)行與 Django 項目無關的任務,以及在不同的項目之間切換。
- 例如,可以使用 django-admin startproject projectname 來創(chuàng)建一個新的 Django 項目,而無需在項目目錄中使用 manage.py。
4.2 manage.py
- manage.py 是每個 Django 項目根目錄中的腳本,它是由 Django 自動生成的。
- manage.py 是用于管理特定 Django 項目的命令行工具。它提供了一種在項目內(nèi)部執(zhí)行管理任務的方式。
- 可以使用 manage.py 來執(zhí)行數(shù)據(jù)庫遷移、運行開發(fā)服務器、創(chuàng)建超級用戶、執(zhí)行測試、收集靜態(tài)文件等與項目相關的任務。
????????python manage.py 回車:可以查看 manage.py 后續(xù)相關命令或參數(shù)
????????python manage.py help:這將列出 manage.py
支持的所有命令以及它們的描述。這個命令將幫助了解可用的 Django 管理命令以及如何使用它們。
????????python manage.py help <command>:其中 <command>
是你想要獲取幫助的特定命令的名稱。這將顯示有關該命令的詳細信息,包括用法、選項和參數(shù)。
????????總的來說,django-admin
是全局工具,而 manage.py
是特定于每個 Django 項目的工具。通常情況下,會在項目的根目錄中使用 manage.py
來執(zhí)行項目管理任務。如果需要執(zhí)行與項目無關的全局任務(例如創(chuàng)建新項目),則可以使用 django-admin
。
總結
????????在下一篇中會講解進一步的路由,視圖與后臺操作等,涉及Django的命令也會在后續(xù)編寫一個常用命令總結。
Django官方網(wǎng)址
? ? ? ?Getting started with Django | Djangohttps://www.djangoproject.com/start/
Django官方文檔
? ? ? ? 此處為4.2版本
? ? ? ?https://docs.djangoproject.com/en/4.2/https://docs.djangoproject.com/en/4.2/
?文章來源:http://www.zghlxwxcb.cn/news/detail-856033.html
? ? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-856033.html
到了這里,關于Django學習(1):Django項目的初步創(chuàng)建與簡單配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!