橡皮擦,一個逗趣的互聯網高級網蟲,新的系列,讓我們一起進入 Django 世界,
已經完成的文章
- 滾雪球學 Python 第三輪,Python Web 之 Django 的世界
- 小手哆嗦一下,就能用 Python Django 實作一個微型博客系統
- Django 做個小后臺,細節在完善一點點,滾雪球學 Python 第三階段
- Django QuerySet 就學那么一點點,一點點就夠了
- 看完這篇博客,Python Django 你就學會一半了
滾雪球學 Python 第三輪
- 已經完成的文章
- 六、Python Django 菜譜系統
- 6.1 菜譜系統相關設計
- 6.2 Django 中的資料模型
- 6.2.1 模型的資料欄位(Field types)
- 6.2.2 模型關系
- 6.2.3 欄位引數
- 6.3 菜譜系統模型設計
- 6.3.1 pycharm 創建 Django 專案
- 6.3.2 models.py 撰寫模型
- 6.4 本篇博客小節
六、Python Django 菜譜系統
從本篇博客開始,我們將正式進入 Django 專案化的課程中,從一個菜譜系統開始,逐步掌握 Django 開發網站的各種技術點,
第一個專案屬于管理類內部系統,假設,用戶量少,使用頻率不高,功能不多,實作對菜譜的增刪改查即可,
基本功能清單如下:
- 用戶登錄與注冊
- 用戶權限管理
- 菜譜的添加
- 菜譜的洗掉
- 菜譜的修改
- 分類展示菜譜
- 查詢菜譜
6.1 菜譜系統相關設計
菜譜系統最核心的就是菜譜了,菜譜包含如下資訊:名稱、工藝、口味、烹飪時間、難度、主料、輔料,還有誘人圖片,
用戶權限設計兩個身份即可,普通用戶無需登錄就可以查詢資料,管理員可以進入菜譜有關管理頁面對資料進行維護,
相關頁面可以簡單進行拆解:
- 用戶的歡迎頁面,網站首頁
- 菜譜的串列頁面
- 菜譜詳情頁面
- 用戶登錄與注冊頁面
- 菜譜添加與修改頁面
有了上述資料,基本可以確定該系統包括兩張核心表,一張為用戶表,一張為菜譜表,所有的操作都將圍繞以上兩個表或者模型來實作,
6.2 Django 中的資料模型
在正式開始設計菜譜系統的表結構之前,需要先掌握 Django 的模型(Model)相關知識,作為 Web 框架而言,Django 也提供了完整的 ORM 框架,ORM 在之前的博客也簡單說明過,叫做物件-關系映射框架,
該框架可以將資料庫中的關系映射到 Python 的類與物件中,一般情況下,每一個模型都映射著一張資料表,模型中的每一個屬性都對應資料表中的一個欄位,這個概念需要先理解清楚,
6.2.1 模型的資料欄位(Field types)
截止到 橡皮擦 撰寫本文的時候,Django 中的基本資料欄位型別 30 個左右,該數量不固定,具體你可以依據 Django 版本自行查詢,https://docs.djangoproject.com/en/3.1/ref/models/fields/#field-types
為了便于學習,你可以對這些基本資料欄位型別進行簡單的分類,
數字類欄位
AutoField:如果沒有給模型指定一個主鍵,Django 會自動給模型添加一個AutoField型別的欄位,該欄位是一個自增的整數;BitAutoField:與AutoField含義一致,就是資料范圍更大一些,如果該表資料量大,使用它即可;SmallAutoField:Django 3.0 新增,看名字就知道范圍比AutoField小;IntegerField:32 位整數,取值范圍-2147483648 to 2147483647;BigIntegerField:從IntegerField派生出來,64 位整數,取值范圍-9223372036854775808 to 9223372036854775807;SmallIntegerField:取值范圍-32768 to 32767;PositiveIntegerField:非負整數型別的欄位,取值范圍0 to 2147483647;PositiveSmallIntegerField:非負,取值范圍0 to 32767;PositiveBigIntegerField:取值范圍0 to 9223372036854775807,這個要注意 Django 3.1 版本才有;FloatField:浮點數型別欄位;DecimalField:十進制數型別欄位,表示一個固定精度的十進制數,這個在用到的時候,詳細說明,
字符類欄位
CharField:字串型別,需要攜帶一個必備屬性max_length,表示字串長度;EmailField:基于CharField但是多了郵箱格式驗證;URLField:同上,多了 URL 特殊處理;SlugField:只包含字母、數字、下劃線或連字符,通常用于 URL;TextField:可存盤大量文本的欄位;UUIDField:UUID 欄位,對應的是 Python 中的 UUID 物件,有時候主鍵會使用 UUID 替代AutoFieldFilePathField:檔案路徑欄位,
檔案類欄位
FileField:處理檔案上傳的欄位,不能作為檔案主鍵;ImageField:圖片欄位,繼承自FileField,
布爾類欄位
BooleanField:只有 True 和 False 兩個值的欄位;NullBooleanField:可空布爾欄位,
日期時間欄位
DateField:對應 Python 中的datetime.date實體;DateTimeField:對應 Python 中的datetime.datetime實體;TimeField:對應 Python 中的datetime.time實體;DurationField:對應 Python 中的timedelta實體,
二進制欄位
BinaryField:二進制欄位,不建議使用,
其它的不常使用,先不涉及,具體有應用場景在進行說明,
6.2.2 模型關系
模型與模型之間存在三種關系,分別是 一對一,一對多,多對多,
接下來先介紹基本使用方式,后文案例中進行深度學習,
多對一關系
例如一個食譜包含多個食材,代碼如下:
# 食材類
class Ingredients(models.Model):
menu = models.ForeignKey("Menu", on_delete=models.CASCADE)
# 菜譜類
class Menu(models.Model):
pass
需要注意的是多對一關系中,在多物件的那個類中增加外鍵關系,使用的方法是 models.ForeignKey(),該方法有兩個引數,第一個是與之關聯的模型名稱,第二個是 on_delete 欄位,關聯的物件被洗掉時該物件的行為,例如 models.CASCADE 就表示級聯洗掉,徹底掌味訓是需要看實際應用場景,
多對多關系
多對多關系屬于比較復雜的模型關系了,在部分情況下,還需要 through_field 來定義中間模型,
# 菜譜類
class Menu(models.Model):
name = models.CharField(max_length=20)
# 口味
class Flavor(models.Model):
name = models.CharField(max_length=10)
contain = models.ManyToManyField(
Menu,
through='MenuContainFlavor', # 該引數為通過哪一個模型進行關聯
through_fields=('flavor', 'menu'), # 關聯欄位名稱,元組的第一個引數是當前模型名稱
)
# 關聯關系模型
class MenuContainFlavor(models.Model):
flavor = models.ForeignKey(Flavor, on_delete=models.CASCADE)
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
上面的案例中,MenuContainFlavor 就是中間模型,主要為了關聯菜譜與口味,
一對一關系
一對一關系基表簡單,與外鍵欄位類似,一對一回傳的是一個物件,因為基本語法非常簡單,可以簡單理解是對一張資料表的資料擴充就可以了,
6.2.3 欄位引數
了解了模型中的欄位型別之后,要知道這些欄位都是基于類的形式存在的,既然是類就會出現一些可選引數,具體內容如下:
null:資料庫層面是否可以為空;blank:業務層面是否可以為空,設定為 True,資料的輸入框可為空;choices:元組或串列格式,表示內容可選項;db_column:指定該欄位在資料表中的名稱;db_index:資料庫索引配置,設定為 True 將會在這個欄位上設定索引;default:默認值;editable:是否可編輯;primary_key:該欄位是否設定為主鍵;unique:唯一索引;verbose_name:可讀性名稱,或者叫做展示文字也可以;validators:自定義邏輯驗證,
6.3 菜譜系統模型設計
學習了基本知識點之后,就可以針對菜譜系統的模型進行相關設計了,
菜譜系統涉及的模型包括:菜譜,主料,輔料,用戶,先暫定這幾個模型,后續如果有需要,再進行擴展,
每個模型涉及的欄位分別如下:
菜譜
- 名稱
- 工藝
- 口味
- 時間
- 難度
主料
- 名稱
- 數量
輔料
- 名稱
- 數量
用戶
- 用戶名
- 郵箱
- 密碼
- 是否管理員
資料欄位暫定為上述內容,后續隨著專案研發進行補充,
6.3.1 pycharm 創建 Django 專案
如果你使用的是專業版的 pycharm 是可以直接一鍵創建的,由于橡皮擦使用的版本是免費的社區辦,故需要自己手動進行創建,
操作步驟十分簡單,只需要用 pycharm 打開一個檔案夾,然后輸入如下命令即可:
> django-admin startproject MenuSystem
> cd MenuSystem
> python manage.py startapp menuapp
生成的目錄結構如下圖所示:

6.3.2 models.py 撰寫模型
下面的作業就是在 models.py 中對模型進行撰寫了,具體代碼如下:
# 菜譜模型類
class Menu(models.Model):
pass
# 主料類
class Ingredients(models.Model):
pass
# 輔料
class SubMaterial(models.Model):
pass
三個模型類先占好位置,然后在進行拆解,詳細內容撰寫如下:
from django.db import models
# Create your models here.
# 菜譜模型類
class Menu(models.Model):
name = models.CharField(max_length=50, verbose_name="菜譜名稱")
technology = models.CharField(max_length=10, verbose_name="工藝")
flavor = models.CharField(max_length=50, verbose_name="口味")
production_time = models.IntegerField(default=0, verbose_name="制作時間")
difficulty = models.SmallIntegerField(default=0, verbose_name="難度")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="創建時間")
# 定義類的 __str__ 方法,便于將模型物件當做引數輸出時顯示菜譜名稱
def __str__(self):
return self.name
# 主料類
class Ingredients(models.Model):
name = models.CharField(max_length=50, verbose_name="主料名稱")
quantity = models.IntegerField(default=0, verbose_name="數量")
# 一個主料屬于一個菜譜,一個菜譜包含多個主料
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, verbose_name="所屬菜譜")
def __str__(self):
return self.name
# 輔料
class SubMaterial(models.Model):
name = models.CharField(max_length=50, verbose_name="輔料名稱")
quantity = models.IntegerField(default=0, verbose_name="數量")
# 一個輔料屬于一個菜譜,一個菜譜包含多個輔料
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, verbose_name="所屬菜譜")
def __str__(self):
return self.name
該 models.py 中沒有實作用戶模型,本專案使用 Django 自帶的用戶系統,后續為你說明,
6.4 本篇博客小節
本篇博客主要介紹的是 Django 中的資料模型,任何系統的設計都是從表結構開始的,牢牢掌握本篇博客的內容吧,一個很小的承上啟下環節,
相關閱讀
- Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
- Python 游戲世界(更新中,目標文章數 50+,現在訂閱,都是老粉)
- Python 爬蟲小課,精彩 9 講
django微信小程式商城 Django 教程 2020年php涼透了 django和spring比較 django開源專案 為什么大公司很少用vue python的django框架 django怎么安裝 django企業開發實戰pdf今天是持續寫作的第 123 / 200 天,
如果你想跟博主建立親密關系,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯網高級網蟲,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272027.html
標籤:其他
