Django編寫自定義manage命令

2021-09-11 16:45:10 字數 4479 閱讀 5632

我們再使用django寫專案的時候,不可避免的我們會使用到一些manage命令,如django-admin startproject,python manage.py runserver …等命令,然後這些命令就能完成相應的事情。

但有時候django自帶的這些命令也不能滿足我們的需求,我們就可以自己編寫實現自己的一些需求的命令了。

例如:我們實現乙個createuser的命令。我們在終端執行這條命令的時候,就會在資料庫建立乙個user物件出來。

from django.db import models

# create your models here.

class

user

(models.model)

: name = models.charfield(max_length=20)

telephone = models.charfield(max_length=11)

email = models.emailfield(

)

然後在settings.py檔案裡面配置好資料庫的相關資訊,因為我使用的是mysql資料庫,所以需要配置,如果使用django預設的sqlite資料庫,就不用配置。

然後執行makemigrations和migrate命令,將模型對映到資料庫中。

至此,我們就做好準備工作了。

在django中,我們想要編寫自定義的manage命令,舊的遵循django的規則來建立檔案。

首先,我們建立乙個名為command的類,這個類的名字必須為這個。然後繼承自django.core.management.basecommand類。

from django.core.management import basecommand

class

command

(basecommand)

:help

='建立乙個user使用者'

defhandle

(self,

*args,

**options)

:pass

help這個變數可寫可不寫,這個變數的作用是在使用命令的-h--help引數時會顯示出來的文字,在這裡我們可以寫入這條命令的作用,描述。

handle函式:這個函式是必須寫的函式,我們使用這條命令的時候就會執行這個函式裡面的**。

因為我們這條命令的主要功能是建立乙個user使用者,所以我們首先匯入user物件,然後開始編寫**。

from user.models import user
class

command

(basecommand)

:help

='建立乙個user使用者'

defhandle

(self,

*args,

**options)

: user.objects.create(name=

'aaa'

,telephone=

'1111111111'

,email=

'[email protected]'

) self.stdout.write(

'使用者建立成功'

)

注意: 這裡我們一般不使用print()列印資訊,而是使用self.stdout.write來列印資訊。

這樣,我們就編寫好了一條簡單的建立乙個user物件的命令。然後我們在終端執行命令:

python manage.py selfcommand(在建立的包的下面的檔案的名字)
然後在終端就會列印出使用者建立成功的資訊,然後我們去資料庫也能檢視到建立的user物件的資訊

但是,這個時候就會出現乙個比較尷尬的問題,就是我們建立user使用者的時候,肯定需要別人自己輸入資訊,但是我們並沒有讓別人自己輸入資訊,而是直接建立乙個定死的user物件。所以,這個時候就需要我們給這條命令新增引數了。

如果想給命令新增引數,那麼我們在這個類中就得新建乙個方法,名為add_argument

class

command

(basecommand)

:help

='建立乙個user使用者'

defadd_arguments

(self, parser)

: parser.add_argument(

'name'

,help

="指定name欄位"

)# name 必須引數,輸入的第乙個引數的值將賦值給name,必須引數

parser.add_argument(

'-t'

,'--telephone'

,help

="指定telephone欄位"

)# 可選引數 -t 或 --telephone -t是簡寫形式。

defhandle

(self,

*args,

**options)

: name = options[

'name'

]if options[

'telephone']:

telephone = options[

'telephone'

]else

: telephone =

'11111111111'

user.objects.create(name=name,telephone=telephone,email=

'[email protected]'

) self.stdout.write(

'使用者建立成功'

)

在上面我們定義了兩個引數,乙個必須引數,乙個可選引數,因此,我們再使用這條命令的時候必須傳入name引數,而telephone引數可以不傳,然後我們在handel方法中對得到的引數進行了處理。

python manage.py selfcommand ccc
python manage.py selfcommand ddd -t 18888888888
我們也可以使用python manage.py -h檢視這條命令的幫助,也能看到我麼自定義的引數。

我們再使用命令的時候,特別在使用一些剛接觸不久的命令的時候,很容易出現非正確的使用命令,那麼我們就需要丟擲乙個異常,告訴他命令使用錯誤了。

首先我們的匯入乙個類

from django.core.management import commanderror
例如,我們在傳入手機號碼的時候,如果位數超過了11位,那麼我們就丟擲乙個異常:

def

handle

(self,

*args,

**options)

: name = options[

'name'

]if options[

'telephone']:

telephone = options[

'telephone']if

len(telephone)

>=11:

raise commanderror(

"手機號碼不能超過11位"

)else

: telephone =

'11111111111'

user.objects.create(name=name,telephone=telephone,email=

'[email protected]'

) self.stdout.write(

'使用者建立成功'

)

這裡,我們就使用到了commanderror類來丟擲了異常,從而保證了我們程式的健壯性了。

當使用者輸入的**號碼長度大於11位的時候,就會丟擲乙個異常而終止程式。

注意: 我們在引數中輸入的值,在handel函式中都是以字元竄的形式得到,就算我們輸入的是整數,也會變成字元竄的形式,如果想得到整數形式的值,我們可以在add_argument()中新增type=int引數。

示例:

parser.add_argument(

'id'

,help

="user物件的id"

,type

=int

)

更多有關自定義manage命令的操作可以檢視官方文件:

編寫自定義特性

自定義特性一般標註在作用的程式元素的上方 編譯器首先組合特性名稱和attribute,然後尋找該組合名,所以特性名為fieldname和fieldnameattribute的兩個特性沒有區別 編譯器將尋找包含有這個名稱的類,它直接或者間接的派生資system.attribute 編寫自定義類的步驟 ...

編寫自定義GenericServlet

具體步驟如下 1 新建類mygenericservlet,實現servlet,servletconfig介面 2 重寫父類的相關方法 3 將service 方法定義為抽象 abstract 方法,將類定義為抽象類,以便在子類予以service 方法新的實現 4 定義mygenericservlet的...

Django 自定義標籤

模版是乙個用django模版語言標記過的python字串。模版可以包含模版標籤和變數。模版標籤是在乙個模版裡起作用的標記。比如,乙個模版標籤可以產生控制結構的內容 if或者for 可以獲取資料庫內容或者訪問其它模版標籤。乙個標籤塊被包圍 變數標籤被 包圍 context是乙個傳遞給模版的key va...