程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【邂逅Django】——(二)數據庫配置

編輯:Python

邂逅Django - 目錄

  Part 1:【邂逅Django】—— (一)創建項目

Part 2:【邂逅Django】—— (二)數據庫配置

️ Part 3:【邂逅Django】—— (三)視圖

️ Part 4:【邂逅Django】—— (四)表單和通用視圖

️ Part 5:【邂逅Django】—— (五)完善界面(自定義界面和樣式)

️ Part 6:【邂逅Django】—— (六)自定義管理界面

️ Part 7:【邂逅Django】—— (七)自動化測試


文章目錄

  •   邂逅Django - 目錄
  •   前言
  •  一、項目配置文件`settings.py`
    •   1.1 數據庫配置
    •   1.2 時區和語言
    •   1.3 `Django`默認的自帶應用簡介
  •  二、創建模型
  •  三、激活模型
  •  四、初試API
    •   4.1 `Django`交互式命令的基本使用
    •   4.2 給模型添加自定義方法
  •  五、`Djaong`管理界面
    •   5.1 創建一個管理員帳號
    •   5.2 登錄管理界面
    •   5.3 向管理頁面增加投票應用
    •   5.4 體驗便捷的管理功能
  •  六、【`PyCharm`使用小技巧】
    •   6.1 使用`PyCharm`的工具運行`makemigrations & migrate`
    •  6.2 使用`PyCharm`運行`django shell`
  •  七、最簡單的美化Django Admin
    •   7.1 `simpleui`簡介
    •   7.2 `simpleui`使用
      •   7.2.1 安裝
      •   7.2.2 開始使用
  •  總結


前言

本系列文章,在Django官方文檔教程的基礎模板下,進行了一定的改進和刪除,添加了一些自己的見解。

希望大家看完該系列文章後,對Django能夠有一個清晰的認識。

路漫漫兮其修遠兮,吾將上下而求索!

Django官方文檔 https://www.djangoproject.com/

學習過程中,多看官方文檔,可以解決很多問題

本教程使用poetry對項目環境進行管理。
相關poetry的安裝與使用,請參考 【Python - 虛擬環境】項目的啟動,從隔離開發環境開始_CoderChaos的技術博客_51CTO博客

一、項目配置文件settings.py

1.1 數據庫配置

mysite/settings.py ,是個包含了Django項目設置的Python模塊。

數據庫的配置,在於變量DATABASES

Django默認使用SQLite作為默認數據庫。Python內置SQLite,所以無需安裝額外的東西就可以使用。

如果做一個真正的項目,最好不要使用SQLite

# Django 默認使用 SQLite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Django使用MySQL配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite', # 使用MySQL時,需要提前在MySQL創建mysite數據庫
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '******'
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

參數說明:

  • defaultDjango連接數據庫時,默認鏈接default下的數據庫。
  • ENGINE:有多個可選值
    • django.db.backends.sqlite3
    • django.db.backends.postgresql
    • django.db.backends.mysql
    • django.db.backends.oracle
    • 其他第三方數據庫後端。 參考地址
  • NAME:數據庫的名稱。如果使用SQLite,數據庫將是電腦上的一個文件。默認值BASE_DIR / 'db.sqlite3',將把數據庫存儲在項目的根目錄。
  • 其他參數:如果不使用SQLite,則必須添加一些額外設置,比如USERPASSWORDHOST等等。 參考文檔

注意:如果使用SQLite以外的數據庫,需要確認在使用前已經創建了數據庫。可以通過在你的數據庫交互式命令行中使用CREATE DATABASE database_name;來完成數據庫的創建。

1.2 時區和語言

可以在settings.py文件中,修改時區和語言。

# 語言
LANGUAGE_CODE = "zh-hans"
# 時區
TIME_ZONE = "Asia/Shanghai"

  • 1.
  • 2.
  • 3.
  • 4.

1.3 Django默認的自帶應用簡介

settings.py文件中的一些說明:INSTALLED_APPS
INSTALLED_APPS 默認包括以下 Django 的自帶應用:

  • django.contrib.admin:管理員站點
  • django.contrib.auth:認證授權系統
  • django.contrib.contenttypes:內容類型框架
  • django.contrib.sessions:會話框架
  • django.contrib.messages:消息框架
  • django.contrib.staticfiles:管理靜態文件的框架

默認開啟的某些應用需要至少一個數據表,所以,在使用它們之前需要在數據庫中創建一些表。需要執行以下命令:python manage.py migrate

二、創建模型

定義模型,也就是數據庫結構設計和附加的其他元數據。

在這個投票應用中,需要創建兩個模型:問題Question和選項Choice

  • Question模型包括問題描述和發布時間。
  • Choice模型包括選項描述和當前得票數。每個選項屬於一個問題。
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("發布日期")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

創建模型,繼承django.db.models.Model;每個模型有許多類變量,都表示模型裡的一個數據表字段。

每個字段都是Field類的實例。

說明:

  • Django可以為應用創建數據庫表(CREATE TABLE
  • Django可以創建與QuestionChoice對象進行交互的Python數據庫API

三、激活模型

Django應用是“可插拔”的。

添加polls應用

# mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
# 或'polls.apps.PollsConfig',
]

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

現在,Django項目已經包含polls應用。

運行命令makemigrations,進行一次遷移:python manage.py makemigrations

運行makemigrations命令,Django會檢測模型文件的修改,並且把修改的部分存儲為一次遷移。遷移是Django對數據結構變化的一次存儲。

migrate是自動執行數據庫遷移並同步管理數據庫結構的命令。

因此,執行makemigrations之後,要想修改在數據庫做出同步,需要再次執行python manage.py migrate

遷移是非常強大的功能,能夠在開發過程中持續的改變數據庫結構而不需要刪除表和重新創建表。
它專注於數據庫平滑升級而不會丟失數據。

改變模型需要以下步驟:

  • 編輯models.py文件,改變模型
  • 運行 python manage.py makemigrateions 為模型的改變生成遷移文件
  • 運行 python manage.py migrate 應用數據庫遷移

四、初試API

4.1 Django交互式命令的基本使用

進入Django交互式命令行:python manage.py shell

>>> from polls.models import Choice, Question
# 查看表Question表中的數據
>>> Question.objects.all()
<QuerySet []> # 目前沒有數據
>>> from django.utils import timezone
# 創建一個Question數據對象
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 存儲數據對象到數據庫
>>> q.save()
# 查看 q 對象屬性
>>> q.id
1
>>> q.question_text
"What's' new?"
>>> q.pub_date
datetime.datetime(2022, 3, 20, 11, 29, 15, 780052, tzinfo=datetime.timezone.utc)
# 修改 q 對象的屬性
>>> q.question_text = "What's up?"
>>> q.save()
# 再次查看 Question 表中的數據
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

對於Question返回的顯示數據,可以通過編輯Question模型代碼進行修改,給QuestionChioce增加__str__()方法。

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("發布日期")
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

再次進入Django交互式命令行:python manage.py shell

Question.objects.all()
<QuerySet [<Question: What's up?>]>

  • 1.
  • 2.

4.2 給模型添加自定義方法

import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("發布日期")
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

再次進入Django交互式命令行:python manage.py shell

>>> from polls.models import Question, Choice
# 查看 __str__() 是否已生效
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# Django database API:filter
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# 如果數據庫中不存在數據,則會拋出異常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\query.py", line 496, in get
raise self.model.DoesNotExist(
polls.models.Question.DoesNotExist: Question matching query does not exist.
# 通過主鍵獲取數據對象
>>> Question.objects.get(pk=1)
<Question: What's up?>
>>> q = Question.objects.get(pk=1)
# 使用 models.py 中自定義的方法
>>> q.was_published_recently()
True
# 查看 q 對象,外鍵所對應的對象
>>> q.choice_set.all()
<QuerySet []>
# 給 q 對象添加外鍵元素
>>> 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)
# 查看 c 元素(Choice 對象)
>>> c
<Choice: Just hacking again>
# 查看 c 元素的屬性
>>> c.question
<Question: What's up?>
# 查看 q 對象,外鍵所對應的對象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
# 刪除 c 對象
>>> c.delete()
(1, {'polls.Choice': 1})
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>]>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.

五、Djaong管理界面

管理界面不是為了網站的訪問者,而是為管理者准備的。

5.1 創建一個管理員帳號

在命令行運行以下命令:python manage.py createsuperuser
之後會提示,輸入用戶名、郵箱、密碼、確認密碼。

> python manage.py createsuperuser
用戶名 (leave blank to use 'administrator'): admin
電子郵件地址: [email protected].com
Password: ******
Password (again): ******
密碼長度太短。密碼必須包含至少 8 個字符。
這個密碼太常見了。
密碼只包含數字。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

5.2 登錄管理界面

啟動開發服務器:python manage.py runserver
打開浏覽器: http://127.0.0.1:8000/admin/
輸入帳號和密碼,即可進入管理界面。

5.3 向管理頁面增加投票應用

# polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

5.4 體驗便捷的管理功能

點擊頁面中的按鈕,即可使用增刪改查功能。

六、【PyCharm使用小技巧】

6.1 使用PyCharm的工具運行makemigrations & migrate

6.2 使用PyCharm運行django shell

PyCharm底部工具欄,選擇Python Console即可進入python manage.py shell

前提條件:項目啟動Django支持。

項目啟動Django支持見: 【邂逅Django】——(一)創建項目_CoderChaos的技術博客_51CTO博客

四、【PyCharm 使用小技巧】

相比於從Terminal通過python manage.py shell進入Django shell,輸入會有一定的提示。

七、最簡單的美化Django Admin

7.1 simpleui簡介

Django Admin默認界面設計語言存在著的一些不足,比如色彩單一,大量線條的使用,分割化明顯。將這些不足歸類一下就是界面單調、雷同性明顯、缺少驚喜。

simpleui:一款基於vue+element-ui的django admin現代化主題。

GitHub地址: https://github.com/newpanjing/simpleui

7.2 simpleui使用

7.2.1 安裝

poetry add -D django-simpleui

  • 1.

7.2.2 開始使用

安裝完成後,在自己項目的settings.py文件中INSTALLED_APPS第一行加入simpleui。

# settings.py
INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls'
]

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

如果之前的服務還在運行,刷新頁面即可。


總結

本文簡單介紹了Django與數據庫的連接與使用,默認後台管理界面的使用。

以及使用PyCharm快捷運行makemigrations & migrate命令和django shell,使用django-simpleui美化默認後台管理界面。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved