二、【用django2.0來開發】後臺會員管理(一) 模型創建與數據遷移

這一篇主要是介紹django的模型如何創建, 模型的一些參數, 以及數據如何遷移

項目地址:https://gitee.com/ccnv07/django_example

創建會員模塊

首先我們先創建一個會員模塊

> cd cms
> python manager.py account

這樣就在根目錄下創建了一個account文件夾

創建一個會員模型

關於數據庫的表模型代碼需要寫在models.py文件中
account/models.py中的文件代碼
二、【用django2.0來開發】後臺會員管理(一) 模型創建與數據遷移

最終生成的數據表的名稱爲模塊名_類名
模型中基本分爲三塊

  1. 聲明的字段信息
  2. 模型的元類, 包含模型的一些配置信息
  3. 模型的其他方法

模型的字段

模型不僅會影響到數據庫表的創建, 而且會影響到後臺表單的展示

我們只介紹最常用的幾種模型字段和選項說明
CharField字段
對應的是數據庫的varchar字段, 保存字符串
對應的表單是input類型
max_length 可以指定字符串的長度, 對應的生成的sql代碼就是varchar(64)

DateField字段
對應數據庫的date字段, 保存年-月-日的信息
對應表單中的日期選擇控件
auto_now_add 是指定在數據新增時, 自動寫入時間
auto_now 是無論新增還是更新數據, 此字段都會更新爲當前時間
auto_now_add和auto_now不可以同時設置, 否則會提示你

account.Account.update_time: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present

DateTimeField字段
同DateField字段, 只不過是包含日期+時間

EmailField
對應表單的input, 但是會添加郵件格式校驗
django裏是郵件字段, 其實數據庫是varchar字段, 最終繼承的是CharField字段, 但是可以輔助驗證郵件的格式, 所以它也有max_length參數

IntegerField
數字字段, 對應數據庫的int(11)類型
max_length 指定最大長度
min_length 指定最小長度
choice 指定字段的選項, 格式是((值, 值說明),), 這個參數會影響到後臺表單的展示、新增和編輯

SmallIntegerField
存儲範圍比較小, 其他同IntegerField

TextField
文本類型字段, 對應數據庫的text()

字段的公共參數

這些參數基本在所有字段中都可以設置, 所以單獨拿出來介紹一下
null
如果是True, 則可以null值, 默認是False, 但是在TextField字段中, 這個應該一直是False, 設置爲True, 數據庫會報錯

blank
如果是True, 則允許插入空值, 默認是False, 這個插入的是空, 對應字符串是'', 而不是null值

choice
字段的選項值, 設置這個參數後, 後臺表單就會變成下拉的格式

db_name
字段名, 如果指定這個, 如果不指定, 採用的是模型類屬性的名稱小寫, 設置了以後, 則使用這個名稱

db_index
設置爲True, 則會在這個字段上創建索引

default
設置字段的默認值, 不僅支持普通的數據類型, 也支持函數


def contact_default():
    return {"email": "[email protected]"}

contact_info = JSONField("ContactInfo", default=contact_default)

editable
如果是False, 則不會展示在後臺或者任何其他的ModelForm中, 也會跳過模型驗證, 默認是True

error_messages
設置驗證失敗時的錯誤信息

account = account = models.CharField(max_length=64, blank=True,  verbose_name='用戶名', error_messages={
    'max_length': '最大長度不可超過64個字符'
})

help_text
指定在表單頁面的幫助說明問題

primary_key
默認是False, 如果沒有指定字段的這個參數, 則django會自動添加一個id字段作爲主鍵。
primary_key=True則必然null=False 並且unique=True

unique
如果是True, 則這個字段必須是唯一的

verbose_name
指定後臺中列表頁, 新增編輯頁面顯示的表單字段名稱

模型元類Meta參數

django中的元類用來設置一些指定的操作, 以及後臺的一些設置

class Account(models.Model):
    class Meta:
        ordering = ['-id']
        verbose_name = '會員'
        verbose_name_plural = '會員管理'

class Meta就是一個元類

app_label
指定此模型所屬的模塊名, 如果更改後, 會影響到表的名稱

base_manager_name
指定模型的基本管理者類名稱(就按照管理者來翻譯吧)
先簡單說一下, 我們在使用django查詢的時候, 都會執行django.objects.
那麼爲什麼要這麼麻煩的加一個objects呢?
其實objects的作用就是返回了一個manager類, 而Model其實只是模型結構的聲明, Manager類纔是真正操作數據庫的類

db_table
指定數據庫表名

default_manager_name
默認管理者的名稱, 和base_manager_name類似, 稍後專門會有一篇文章解釋

get_latest_by
排序用的, 只能設置DateField, DateTimeField, IntegerField. 這個會作用於Manager的latest()和earliest()方法

# Latest by ascending order_date.
get_latest_by = "order_date"

# Latest by priority descending, order_date ascending.
get_latest_by = ['-priority', 'order_date']

解釋一下, django中-priority代表倒序, priority代表正序

order
類似get_latest_by, 執行查詢時, 會影響到排序方式order_by這個方法

indexes
設置表的索引

from django.db import models

class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]

fields 指定索引列, name是索引名

unique_together
指定唯一字段

unique_together = ("driver", "restaurant")

在寫入數據時, driverhe restaurant必須是唯一的

verbose_name
指定一個表的顯示名稱, 影響後臺麪包屑導航的顯示名稱

verbose_name_plural
影響後臺列表頁的顯示名稱

以上就把關於模型常用的參數, 屬性都介紹了, 對照demo的代碼大家可以理解一下

註冊模塊

執行數據遷移之前, 先要將模塊註冊到項目中, 因爲django的模塊設計是可插拔的, 減少耦合性

# cms/settings.py
INSTALLED_APPS = [
    'django.contrib.admin', 
    'django.contrib.auth',
    'django.contrib.contenttypes', 'django.contrib.sessions',
    'django.contrib.messages', 'django.contrib.staticfiles',
    'account' # 將模塊名寫入list中就完成了註冊
]

如果不執行註冊, 那麼項目就不會加載這個模塊, 也無法執行數據遷移、模塊訪問, 包括後臺的操作了

同步模型到數據庫(數據遷移)

創建遷移文件

> cd cms
> python manager.py makemigrations

會提示

Migrations for 'account':
  account/migrations/0001_initial.py
    - Create model Account

打開account/migrations/0001_initial.py文件
可以看到我們聲明的Model已經轉換爲了遷移文件, 到這一步其實還沒有將模型同步到數據庫

查看遷移狀態以及遷移執行的sql

python manager.py showmigrations account
account
    [ ] 0001_initial

說明0001_initial還未遷移, 如果遷移完成則會變成[x]0001_initial

接下來我們查看一下執行遷移會出發的sql

python manage.py sqlmigrate account 0001_initial
BEGIN;
--
-- Create model Account
--
CREATE TABLE `account_account` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `account` varchar(200) NOT NULL UNIQUE, `password` varchar(32) NOT NULL, `email` varchar(32) NOT NULL, `phone` varchar(11) NOT NULL, `status` integer NOT NULL, `create_time` datetime(6) NOT NULL, `update_time` datetime(6) NOT NULL);
COMMIT;

不同的數據庫返回的sql可能是不同的

執行遷移

python manager.py migrate

返回

Operations to perform:
  Apply all migrations: account, admin, article, auth, contenttypes, sessions
Running migrations:
  Applying account.0001_initial... OK

則說明遷移成功, 打開mysql管理工具就可以看到我們創建的account_account這個表了


二、【用django2.0來開發】後臺會員管理(一) 模型創建與數據遷移

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章