Django是一個(gè)web框架
在Django中創(chuàng)建項(xiàng)目:
#創(chuàng)建項(xiàng)目 末尾句點(diǎn)讓新項(xiàng)目使用合適的目錄結(jié)構(gòu)
PS C:\Users\hp\Desktop\learning_log> django-admin startproject learning_log .
#dir查看文件信息
PS C:\Users\hp\Desktop\learning_log> dir
? ? 目錄: C:\Users\hp\Desktop\learning_log
Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d-----? ? ? ? 2021/3/1? ? 14:11? ? ? ? ? ? ? ? .vscode? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
d-----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? ? ? learning_log? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 690 manage.py? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
PS C:\Users\hp\Desktop\learning_log> dir learning_log
? ? 目錄: C:\Users\hp\Desktop\learning_log\learning_log
Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name
----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 417 asgi.py
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? 3200 settings.py? ? #指定Django如何與系統(tǒng)交互以及如何管理項(xiàng)目
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 775 urls.py? ? #應(yīng)該創(chuàng)建哪些頁(yè)面來(lái)響應(yīng)瀏覽器請(qǐng)求
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 417 wsgi.py? ? #幫助Django提供它創(chuàng)建的文件
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? ? 0 __init__.py
創(chuàng)建數(shù)據(jù)庫(kù):
#遷移migrate鳄袍,首次執(zhí)行讓django確保數(shù)據(jù)庫(kù)與項(xiàng)目的當(dāng)前狀態(tài)匹配.使用SQLite中酷师,首次將新建數(shù)據(jù)庫(kù)
PS C:\Users\hp\Desktop\learning_log> python manage.py migrate
Operations to perform:? ? #指出它將準(zhǔn)備好數(shù)據(jù)庫(kù)滔驾,用于存儲(chǔ)執(zhí)行管理和身份驗(yàn)證任務(wù)所需的信息
? Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
? Applying contenttypes.0001_initial... OK
? Applying auth.0001_initial... OK
? Applying admin.0001_initial... OK
? Applying admin.0002_logentry_remove_auto_add... OK
? Applying admin.0003_logentry_add_action_flag_choices... OK
? Applying contenttypes.0002_remove_content_type_name... OK
? Applying auth.0002_alter_permission_name_max_length... OK
? Applying auth.0003_alter_user_email_max_length... OK
? Applying auth.0004_alter_user_username_opts... OK
? Applying auth.0005_alter_user_last_login_null... OK
? Applying auth.0006_require_contenttypes_0002... OK
? Applying auth.0007_alter_validators_add_error_messages... OK
? Applying auth.0008_alter_user_username_max_length... OK
? Applying auth.0009_alter_user_last_name_max_length... OK
? Applying auth.0010_alter_group_name_max_length... OK
? Applying auth.0011_update_proxy_permissions... OK
? Applying auth.0012_alter_user_first_name_max_length... OK
? Applying sessions.0001_initial... OK
#SQLite是一種使用單個(gè)文件的數(shù)據(jù)庫(kù)旧巾,是編寫簡(jiǎn)單應(yīng)用程序的理想選擇,因?yàn)樗屇悴挥锰P(guān)注數(shù)據(jù)庫(kù)管理的問(wèn)題
PS C:\Users\hp\Desktop\learning_log> dir
? ? 目錄: C:\Users\hp\Desktop\learning_log
Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name
----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----
d-----? ? ? ? 2021/3/1? ? 14:11? ? ? ? ? ? ? ? .vscode
d-----? ? ? ? 2021/3/1? ? 14:33? ? ? ? ? ? ? ? learning_log
-a----? ? ? ? 2021/3/1? ? 14:33? ? ? ? 131072 db.sqlite3? ? #創(chuàng)建了一個(gè)文件db.sqlite3
-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 690 manage.py
查看項(xiàng)目:
#使用命令runserver查看項(xiàng)目狀態(tài)
PS C:\Users\hp\Desktop\learning_log> python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).? ? #通過(guò)檢查確認(rèn)正確創(chuàng)建了項(xiàng)目
March 01, 2021 - 14:59:15
Django version 3.1.7, using settings 'learning_log.settings'? ? #指出Django的版本以及當(dāng)前使用的設(shè)置文件名稱
Starting development server at http://127.0.0.1:8000/? ? #指出項(xiàng)目的URL 在當(dāng)前系統(tǒng)端口8000上偵聽(tīng)請(qǐng)求
Quit the server with CTRL-BREAK.
瀏覽器中輸入http://localhost:8000/:
創(chuàng)建應(yīng)用程序:
PS C:\Users\hp\Desktop\learning_log> python manage.py startapp learning_logs? ? #新建learning_logs
PS C:\Users\hp\Desktop\learning_log> dir learning_logs
? ? 目錄: C:\Users\hp\Desktop\learning_log\learning_logs
Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name
----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----
d-----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? ? ? migrations
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 66 admin.py
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 105 apps.py
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 60 models.py? ? #定義要在應(yīng)用程序中管理的數(shù)據(jù)
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 63 tests.py
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 66 views.py
-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? ? 0 __init__.py
定義模型:
#每當(dāng)需要修改"學(xué)習(xí)筆記"管理的數(shù)據(jù)時(shí)颜矿,都采取如下三個(gè)步驟:修改models.py,對(duì)learning_logs調(diào)用makemigrations,以及讓Django遷移項(xiàng)目
①創(chuàng)建/修改models.py
from?django.db?import?models
#?在這里創(chuàng)建模型
class?Topic(models.Model):??#?繼承Model
????'''用戶學(xué)習(xí)的主題'''
????#?text是一個(gè)由CharField--由字符串組成的數(shù)據(jù)召衔,即文本
????#?需要存儲(chǔ)少量文本,如名稱祭陷、標(biāo)題或城市苍凛,預(yù)留200字符的空間
????text?=?models.CharField(max_length=200)
????#?是一個(gè)DateTimeField--記錄日期和時(shí)間的數(shù)據(jù)
????#?auto_now_add=True,每當(dāng)用戶創(chuàng)建新主題時(shí)兵志,Django會(huì)自動(dòng)設(shè)置為當(dāng)前日期和時(shí)間
????date_added?=?models.DateTimeField(auto_now_add=True)
????def?__str__(self):
????????'''返回模型的字符串表示'''
????????#?顯示主題的信息
????????return?self.text
激活模型:
將INSTALLED_APP修改成:
INSTALLED_APPS?=?[
????'learning_logs',
????#?默認(rèn)添加的應(yīng)用程序
????'django.contrib.admin',
????'django.contrib.auth',
????'django.contrib.contenttypes',
????'django.contrib.sessions',
????'django.contrib.messages',
????'django.contrib.staticfiles',
]
#接下來(lái)讓Django修改數(shù)據(jù)庫(kù)醇蝴,使其能夠存儲(chǔ)于模型Topic相關(guān)信息
②對(duì)learning_logs調(diào)用makemigrations
PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
? learning_logs\migrations\0001_initial.py
? ? - Create model Topic
#命令makemigrations讓Django確定該如何修改數(shù)據(jù)庫(kù),使其能夠存儲(chǔ)與前面定義的新模型相關(guān)聯(lián)的數(shù)據(jù)
#輸出表明Django創(chuàng)建了一個(gè)名為0001_initial.py的遷移文件想罕,這個(gè)文件將在數(shù)據(jù)庫(kù)中為模型Topic創(chuàng)建一個(gè)表
③Django遷移項(xiàng)目
#下面應(yīng)用這種遷移悠栓,讓Django替我們修改數(shù)據(jù)庫(kù)
PS C:\Users\hp\Desktop\1> python manage.py migrate
Operations to perform:
? Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
? Applying learning_logs.0001_initial... OK? ? #應(yīng)用遷移時(shí)正常
Django管理網(wǎng)站:
1.創(chuàng)建超級(jí)用戶
PS C:\Users\hp\Desktop\learning_log> python manage.py createsuperuser
Username (leave blank to use 'hp'): 11_admin
Email address: 349050532@qq.com
Password:
Password (again):
Error: Your passwords didn't match.
2.向管理網(wǎng)站注冊(cè)模型
#learning_logs中admin.py
from?django.contrib?import?admin
from?.models?import?Topic??#?導(dǎo)入要注冊(cè)的模型Topic
admin.site.register(Topic)??#?讓Django通過(guò)管理網(wǎng)站管理模型
登入網(wǎng)址http://localhost:8000/admin/login/?next=/admin/霉涨,輸入超級(jí)賬號(hào)
3.添加主題
定義模型Entry:
多對(duì)一關(guān)系:每個(gè)條目都與特定主題相關(guān)聯(lián),多個(gè)條目可關(guān)聯(lián)到同一個(gè)主題
from?django.db?import?models
#?在這里創(chuàng)建模型
class?Topic(models.Model):??#?繼承Model
????'''用戶學(xué)習(xí)的主題'''
????#?text是一個(gè)由CharField--由字符串組成的數(shù)據(jù)惭适,即文本
????#?需要存儲(chǔ)少量文本笙瑟,如名稱、標(biāo)題或城市癞志,預(yù)留200字符的空間
????text?=?models.CharField(max_length=200)
????#?是一個(gè)DateTimeField--記錄日期和時(shí)間的數(shù)據(jù)
????#?auto_now_add=True往枷,每當(dāng)用戶創(chuàng)建新主題時(shí),Django會(huì)自動(dòng)設(shè)置為當(dāng)前日期和時(shí)間
????date_added?=?models.DateTimeField(auto_now_add=True)
????def?__str__(self):
????????'''返回模型的字符串表示'''
????????#?顯示主題的信息
????????return?self.text
class?Entry(models.Model):
????'''學(xué)習(xí)的有關(guān)某個(gè)主題的具體知識(shí)'''
????#?外鍵凄杯,指向數(shù)據(jù)庫(kù)中的另一臺(tái)記錄错洁,這里將每個(gè)條目關(guān)聯(lián)到特定主題
????#?創(chuàng)建主題時(shí),都分配了一個(gè)鍵(ID)戒突,需要在兩項(xiàng)數(shù)據(jù)之間建立聯(lián)系時(shí)屯碴,使用相關(guān)聯(lián)鍵
????#on_delete=models.CASCADE在刪除主題的同時(shí)?刪除所有與之相關(guān)聯(lián)的條目,級(jí)聯(lián)刪除
????topic?=?models.ForeignKey(Topic,?on_delete=models.CASCADE)
????#字段長(zhǎng)度不受限制
????text?=?models.TextField()
????#按創(chuàng)建順序呈現(xiàn)條目膊存,并在每個(gè)條目旁放置時(shí)間戳
????date_added?=?models.DateTimeField(auto_now_add=True)
????#Meta存儲(chǔ)用于管理模型的額外信息
????class?Meta:
????????#設(shè)置特殊屬性窿锉,讓Django在需要時(shí)使用Entries來(lái)表示多個(gè)條目
????????#如果沒(méi)有這個(gè)類,Django將使用Entrys來(lái)表示多個(gè)條目
????????verbose_name_plural?=?'entries'
????def?__str__(self):
????????'''返回模型的字符串表示'''
????????return?f"{self.text[:50]}..."
遷移模型:
PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs
#生成新的遷移文件膝舅,告訴Django如何修改數(shù)據(jù)庫(kù)嗡载,使其能夠存儲(chǔ)與模型Entry相關(guān)信息
Migrations for 'learning_logs':
? learning_logs\migrations\0002_entry.py? ??
? ? - Create model Entry
PS C:\Users\hp\Desktop\learning_log> python manage.py migrate? ?
Operations to perform:
? Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
? Applying learning_logs.0002_entry... OK? ? #遷移順利
向管理網(wǎng)站注冊(cè)Entry:
修改admin.py:
from?django.contrib?import?admin
from?.models?import?Topic,?Entry??#?導(dǎo)入要注冊(cè)的模型Topic,Entry
admin.site.register(Topic)??#?讓Django通過(guò)管理網(wǎng)站管理模型
admin.site.register(Entry)
Django shell:
#輸入數(shù)據(jù),通過(guò)交互式終端會(huì)話以編程方式查看這些數(shù)據(jù)
PS C:\Users\hp\Desktop\learning_log> python manage.py shell
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct? 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from learning_logs.models import Topic? ? #導(dǎo)入模塊Topic
>>> Topic.objects.all()? ? #獲取所有實(shí)例仍稀,這將返回一個(gè)查詢集(queryset)的列表
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>
#可以像遍歷列表一樣遍歷查詢集洼滚,查看分配給每個(gè)主題對(duì)象的ID:
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>
>>> topics = Topic.objects.all()
>>> for topic in topics:? ? ? ?
...? ? print(topic.id,topic)
...
1 Chess
2 Rock Climbing
#知道主題對(duì)象的ID后,就可使用方法Topic.objects.get()獲取該對(duì)象并查看其屬性
>>> t=Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2021, 3, 1, 8, 54, 20, 684484, tzinfo=<UTC>)
#查看相關(guān)聯(lián)的條目
>>> t.entry_set.all()
<QuerySet [<Entry: Chinese chess is a kind of chess game originated i...>, <Entry: Chess is mainly popular in
Chinese and countries w...>]>
#假如有模型Pizza,Topping.Topping通過(guò)外鍵關(guān)聯(lián)到Pizza技潘,如果有一個(gè)名為my_pizza的Pizza對(duì)象遥巴,就可使用代碼my_pizza.topping_set.all()來(lái)獲取披薩的所有配料