在這篇教程中,我們將設定你的資料庫,創建你的第一個模型,并快速介紹Django的自動生成的管理站點,
ps注意很多人學Python程序中會遇到各種煩惱問題,沒有人幫答疑容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九起起巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python教程專案可拿,,一起相互監督共同進步!
資料庫配置
現在打開mysite/settings.py這是一個普通的python模塊,模塊變數表示Django的設定,
默認情況下,Django配置使用SQLite資料庫,如果你是資料庫初學者,或者只是感興趣想隨便試試Django,這是最簡單的選擇,SQLite包含在Python內,因此你不需要安裝任何其他東西來支持你的資料庫,所以當你開始你的第一個真實專案時,你會想要使用一個更具擴展性的資料庫,比如PostgreSQL,以避免資料庫切換引發的麻煩,
如果你希望使用其他資料庫,安裝合適的資料庫系結并且在DATABASES'default'專案中修改keys以匹配資料庫連接設定:
-
ENGINE
比如 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', or 'django.db.backends.oracle',還有很多其他后端也有提供,詳情請見 -
NAME
你資料庫的名字,如果你使用SQLite,資料庫將是你計算機上的一個檔案,這種情況下,NAME應該是這個檔案的完整絕對路徑,包括檔案名,默認值os.path.join(BASE_DIR, 'db.sqlite3')將檔案春處在專案目錄中,
如果你不使用SQLite作為你的資料庫,請務必添加USER, PASSWORD, 以及HOST,更多詳情
寫給其他用戶的使用者
如果你在使用SQLite之外的資料庫,請確保你使用前已經創建了資料庫,請在你的資料庫里使用CREATE DATABASE database_name;,
同時確保
mysite/settings.py擁有創建資料庫的權限,這樣就可以自動創建一個在后面的教程中需要的測驗資料庫,
如果你正在使用SQLite,你不需要提前創建任何東西,資料庫檔案會在必要的時候自動創建,
當你開始編輯你的mysite/settings.py,設定你的TIME_ZONE為你的時區,
另外,注意INSTALLED_APPS放在檔案最上面,它承載著這個Django實體中所有活動的Django應用的名字,應用可以被使用于多個專案中,你可以打包分發他們讓別人在別的專案中使用,
默認情況下,INSTALLED_APPS隨Django包含著幾個應用,
django.contrib.admin管理站點,你能立即使用上,
-django.contrib.auth認證系統,
-django.contrib.contenttypes內容型別的框架
-django.contrib.sessionssession框架
-django.contrib.messagesmessaging框架
-django.contrib.staticfiles靜態檔案管理
這些應用默認包括在內以方便開發者使用,
其中一些應用程式,需要至少一個資料庫表才能使用,因此我們需要在資料庫中創建表,然后才能使用,請使用以下的命令:
python manage.py migrate
migrate命令查看INSTALLED_APPS的設定,并根據mysite/settings.py檔案中的資料庫設定創建需要的資料庫表,如果你感興趣的話,打開資料庫命令列,輸入以下命令來看看Django幫你創建了什么,
\dt(PostgreSQL),SHOW TABLES;(MySQL),.schema(SQLite),SELECT TABLE_NAME FROM USER_TABLES;(Oracle)
寫給極簡主義者
正如我們上面所說,我們包含了默認應用為了涵蓋常規使用,但并不是每個人都需要它們,如果你不需要,請在運行migrate之前,從INSTALLED_APPS中隨意把注釋掉或者刪掉對應的代碼,migrate命令只會運行INSTALLED_APPS中的應用,
創建模型
現在,我們使用額外的元資料來定義你的模型(本質上就是你的資料庫布局),
模型的哲學
一個模型是關于您的資料的唯一的確定的來源,它包含著您正在存盤的資料的基本欄位和行為,Django遵從DRY原則,我們的目標是在一個地方定義您的資料模型然后自動地從中獲取資料,這就包括了遷移在里面,舉個例子,不像Ruby on Rails,Django的遷移完全源自您的資料模型,并且本質上只是Django可以通過更新資料庫模式來匹配當前模型的歷史,
在我們這個簡單的投票應用中,我們會創建兩個模型:問題(question)和選擇(choice),一個問題有一個問題內容和一個發布時間,一個選擇有選擇的文本和投票計數器,每個選擇都會和一個問題關聯,
這些概念通過簡單的python類就可以表現出來,按照以下代碼,編輯你的polls/models.py檔案,
polls/models.py
from django.db import models
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published')
class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
這些代碼非常明確,每個模型通過一個繼承自django.db.models.Model的類來表示,每個模型都有一些類變數,每個變數都表示模型中的資料庫欄位,
每個欄位通過實體中的一個欄位類表示,比如CharField是字符欄位,DateTimeField是時間欄位,這會告訴Django每個欄位保存著什么型別的資料,
每個欄位實體的名字(比如question_text和pub_date)是欄位的對機器友好的格式的名字,你以后可以在你的Python代碼中使用這個值,你的資料庫也會用它作為列名稱,
你可以使用(可選的)第一個位置引數作為指定的可讀的名稱,他可以用于Django的幾個introspective(內省)部分,同時作為檔案,如果沒有提供,則Django將使用機器可讀的名稱作為名字,在這個例子中,我們只對Question.pub_date定義了一個名字,對于其他所有的欄位都會默認使用自己的機器名作為名字,
有些欄位類有一些必須的引數要填,舉例,CharField要求你給出最大長度max_length,這不僅會用在資料庫中,也會在驗證中使用,后面我們會講到,
一個欄位也可以擁有很多可選的引數,比如我們可以看到,我們班votes的默認值設成了0,
最后一點,注意關系是由外鍵定義的,這告訴Django,每一個Choice都和只和一個問題相關,Django支持所有常見的資料庫關系:多對一,多對多,一對一,
激活模型(activating models)
這個簡單的模型告訴了Django很多資訊,通過它,Django可以做到:
- 為這個APP創建一個資料庫物件集合
- 創建一個Python資料庫訪問API來訪問問題和選項的物件,
但是首先,我們應該告訴我們的專案,polls應用已經被安裝了,
Django哲學小課堂
Django的應用是可插拔的,您可以在多個專案中使用某個應用程式,你可以分發應用程式,因為他們并不是和給定的Django安裝系結的,
為了把對應的應用包括進我們的專案中,我們需要在INSTALLED_APPS設定中添加對其配置類的參考,PollsConfig類在polls/app.py檔案中,路徑是polls.apps.PollsConfig,編輯mysite/settings.py檔案,添加路徑到INSTALLED_APPS設定中,
mysite/settings.py
INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
現在Django已經知道要把polls應用囊括在內了,下面運行另一條命令:
python manage.py makemigrations polls
你會看到類似下面的結果:
Migrations for 'polls': polls/migrations/0001_initial.py: -Creat model Choice -Create model Question -Add field question to choice
通過運行makemigrations,你可以告訴Django你已經對你的model做出了一些改變,并且你希望這些改變可以作為migration存盤起來,(在現在的例子里是創建了一個新的model)
Django通過Migration來存盤你的模型(也即是資料庫物件)的變化,他們只是硬碟上的一些檔案,如果你想,你可以為你的新模型讀取一個Migration(遷移);也就是polls/migrations/0001_initial.py檔案,不用擔心,你并不需要每次Django作出改變都要讀取它們,但是如果你想手動調整Django如何改變內容,那么它們是被設計為可以人為編輯的,
有一個命令可以幫你運行migration并且自動管理你的資料庫物件,也就是我們稍后會介紹的migrate(遷移),但是首先讓我們看看migration會運行什么樣的SQL,sqlmigrate命令接受遷移名稱,并且回傳其SQL:
python manage.py sqlmigrate polls 0001
你應該會看到類似下面的結果
BEGIN;---- *Create model Choice*--CREATE TABLE "polls_choice" ( "id" serial NOT NULL PRIMARY KEY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL );---- *Create model Question*--CREATE TABLE "polls_question" ( "id" serial NOT NULL PRIMARY KEY, "question_text" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL );----*Add field question to choice*--ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id" FOREIGN KEY ("question_id") REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED;COMMIT;
注意:
- 具體的輸出會根據你如何使用的資料庫而變化,上面的例子是根據PostgreSQL寫的,
- 表的名字會根據應用的名字以及模型的小寫名自動生成(你可以覆寫這個行為)
- 主鍵會自動生成(你可以覆寫這個)
- 按照慣例,django將"_id"附加到外鍵欄位名稱,
- 它根據你使用的資料庫量身打造,因此資料庫特定的欄位型別比如
auto_increment(MySQL),serial(PostgreSQL)或是integer primary key autoincrement(SQLite) 都會自動幫你處理,欄位名的參考也同樣如此, sqlmigrate命令并不會真的讓你的資料庫遷移,只是列印到螢屏上,讓你可以看到Django需要什么SQL,這對于檢查Django在干什么或者有需要SQL腳本更改的資料庫管理員非常有用,
如果你感興趣,你還可以運行python manage.py check,這會不進行任何遷移,不接觸資料庫來檢查你的專案有沒有什么問題,
現在,再次運行migrate創建你的模型吧,
`$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK`
migrate 命令接收所有未應用的遷移(Django通過一個叫做django_migrations的特殊表聊跟蹤哪些遷移被應用了)并根據資料庫運行他們,本質上是將你對模型的更改與資料庫物件進行同步,
遷移非常強大,他可以讓你一邊建設你的專案,一邊慢慢地改變你的資料庫,而且不用洗掉你的資料庫或者表,或者創建一個新的,它專門用于實時升級資料庫,而不會丟失資料,我們將在本教程的后續部分中更深入地介紹它們,但是現在,請記住進行模型更改的三步指南:
- 更改你的模型(在
models.py中), - 運行
python manage.py makemigrations來創建這些更改的遷移 - 運行
python manage.py migrate將這些更改應用于資料庫,
Django有單獨的命令來制作和應用遷移的原因是因為您可以提交遷移到版本控制系統并將其發送到您的應用程式; 它們不僅可以使您的開發更容易,而且還可以被其他開發人員和生產中使用,
請閱讀 django-admin檔案,了解有關 manage.py 可以執行的操作的完整資訊,
玩轉API
現在,我們一起進入互動式的Python shell,并使用Django提供的免費API,要呼叫Python shell,請使用一下命令:
python manage.py shell
我們沒有簡單的輸入python而是使用這個命令,因為manage.py設定了DJANGO_SETTINGS_MODULE環境變數,這給了Django提供了你的mysite/settings.py檔案的Python匯入路徑,
繞過manage.py
如果你不想用manage.py也沒問題, 只要將DJANGO_SETTINGS_MODULE
環境變數設定給mysite.settings,打開一個普通的python shell,然后設定Django:>>>import django>>>django.setup()
如果這引發了一個AttributeError,你也許用的Django版本不是1.11,請更換不同版本的教程或者升級你的Django,
你必須在manage.py所在的目錄下運行Python,或者保證目錄在Python路徑上,
import mysite才能正常作業,
更多相關資訊,請參考django-admin documentation,
進入了shell后,我們來看看database API:
>>> from polls.models import Question, Choice # Import the model classes we just wrote.
# No questions are in the system yet.>>> Question.objects.all()<QuerySet []>
# Create a new Question.# Support for time zones is enabled in the default settings file, so# Django expects a datetime with tzinfo for pub_date. Use timezone.now()# instead of datetime.datetime.now() and it will do the right thing.>>> from django.utils import timezone>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# Save the object into the database. You have to call save() explicitly.>>> q.save()
# Now it has an ID. Note that this might say "1L" instead of "1", depending# on which database you're using. That's no biggie; it just means your# database backend prefers to return integers as Python long integer# objects.>>> q.id1
# Access model field values via Python attributes.>>> q.question_text"What's new?">>> q.pub_datedatetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# Change values by changing the attributes, then calling save().>>> q.question_text = "What's up?">>> q.save()
# objects.all() displays all the questions in the database.>>> Question.objects.all()<QuerySet [<Question: Question object>]>
等一下!<>完全是一個沒有任何幫助的表達,讓我們編輯問題模型(在polls/models.py檔案中)來解決這個問題,然后添加__str__()方法到Question和Choice,
polls/models.py
from django.db import modelsfrom django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible# only if you need to support Python 2class Question(models.Model): def __str__(self): return self.question_text
@python_2_unicode_compatible# only if you need to support Python 2class Choice(models.Model): def __str__(self): return self.choice_text
__str__()方法的添加是很重要的,不光是為了你自己處理互動提示的方便,也是因為物件的展示是通過Django的自動生成admin的,
注意這些都是普通Python方法,現在我們添加一個自定義方法,為了演示使用,
polls/models.py
import datetime
from django.db import modelsfrom django.utils import timezone
class Question(models.Model): def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
請注意,添加import datetime和django.utils import timezone可以分別在django.utils.timezone中參考Python的標準datetime模塊和Django的時區相關實用程式,如果您不熟悉Python中的時區處理,您可以在時區檔案.中了解更多資訊,
保存這些更改并通過再次運行python manage.py shell啟動一個新的Python shell:
>>> from polls.models import Question, Choice
# Make sure our __str__() addition worked.>>> Question.objects.all()<QuerySet [<Question: What's up?>]>
# Django provides a rich database lookup API that's entirely driven by# keyword arguments.>>> Question.objects.filter(id=1)<QuerySet [<Question: What's up?>]>>>> Question.objects.filter(question_text__startswith='What')<QuerySet [<Question: What's up?>]>
# Get the question that was published this year.>>> from django.utils import timezone>>> current_year = timezone.now().year>>> Question.objects.get(pub_date__year=current_year)<Question: What's up?>
# Request an ID that doesn't exist, this will raise an exception.>>> Question.objects.get(id=2)Traceback (most recent call last):...DoesNotExist: Question matching query does not exist.
# Lookup by a primary key is the most common case, so Django provides a# shortcut for primary-key exact lookups.# The following is identical to Question.objects.get(id=1).>>> Question.objects.get(pk=1)<Question: What's up?>
# Make sure our custom method worked.>>> q = Question.objects.get(pk=1)>>> q.was_published_recently()True
# Give the Question a couple of Choices. The create call constructs a new# Choice object, does the INSERT statement, adds the choice to the set# of available choices and returns the new Choice object. Django creates# a set to hold the "other side" of a ForeignKey relation# (e.g. a question's choice) which can be accessed via the API.>>> q = Question.objects.get(pk=1)
# Display any choices from the related object set -- none so far.>>> q.choice_set.all()<QuerySet []>
# Create three choices.>>> q.choice_set.create(choice_text='Not much', votes=0)<Choice: Not much>>>> q.choice_set.create(choice_text='The sky', votes=0)<Choice: The sky>>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
# Choice objects have API access to their related Question objects.>>> c.question<Question: What's up?>
# And vice versa: Question objects get access to Choice objects.>>> q.choice_set.all()<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>>>> q.choice_set.count()3
# The API automatically follows relationships as far as you need.# Use double underscores to separate relationships.# This works as many levels deep as you want; there's no limit.# Find all Choices for any question whose pub_date is in this year# (reusing the 'current_year' variable we created above).>>> Choice.objects.filter(question__pub_date__year=current_year)<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# Let's delete one of the choices. Use delete() for that.>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')>>> c.delete()
有關模型關系的更多資訊,請參閱訪問 相關檔案. 有關如何使用雙下劃線通過API執行欄位查找的更多資訊,請參閱 Field lookups. 有關資料庫API的完整詳細資訊,請參閱我們的 Database API reference.
Django Admin介紹
"Django的哲學"小課堂
Django管理站點是為你的員工或者客戶的簡單的添加,更改,洗掉這些繁瑣作業而設計的,Django管理站點會完全自動生成模型的管理站,
Django當年創建于新聞編輯室,為內容管理而生的,“內容發布者”和“公共”網站之間的界限非常明確,網站管理人員使用該系統添加新聞故事,事件,體育比分等,該內容顯示在公共站點上, Django解決了為站點管理員創建統一界面來編輯內容的問題,
這個管理站點不打算由網站訪問者使用,這是網站經理,
創建一個管理員用戶
首先,我們需要創建一個用戶來登錄管理站點,使用下面的命令:python manage.py createsuperuser
輸入你想要的用戶名Username: admin
輸入郵箱地址Email address: [email protected]
最后輸入你的密碼兩次,Password: **********Password (again): *********Superuser created successfully.
開啟你的開發服務器
django管理站點會自動啟動,我們只要啟動開發服務器就可以來一起探索它了,
使用python manage.py runserver開啟服務器,
現在打開一個瀏覽器,并且去/admin/-例如http://127.0.0.1:8000/admin/你應該會看到Django administration的登錄界面,
進入admin管理站點,
總結:很多人學Python程序中會遇到各種煩惱問題,沒有人幫答疑容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九起起巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python教程專案可拿,,一起相互監督共同進步!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/179634.html
標籤:Python
