django -- models數(shù)據(jù)庫操作---字段及參數(shù)

models操作?----?字段 及 參數(shù)


所有字段類型:

????AutoField(Field)

????????-?int自增列,必須填入?yún)?shù) primary_key=True


????BigAutoField(AutoField)

????????-?bigint自增列,必須填入?yún)?shù) primary_key=True


????????注:當(dāng)model中如果沒有自增列,則自動(dòng)會(huì)創(chuàng)建一個(gè)列名為id的列

????????from?django.db?import?models


????????class?UserInfo(models.Model):

????????????# 自動(dòng)創(chuàng)建一個(gè)列名為id的且為自增的整數(shù)列

????????????username?=?models.CharField(max_length=32)


????????class?Group(models.Model):

????????????# 自定義自增列

????????????nid?=?models.AutoField(primary_key=True)

????????????name?=?models.CharField(max_length=32)


????SmallIntegerField(IntegerField):

????????-?小整數(shù)?-32768?~?32767


????PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)

????????-?正小整數(shù)?0?~?32767

????IntegerField(Field)

????????-?整數(shù)列(有符號(hào)的)?-2147483648?~?2147483647


????PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)

????????-?正整數(shù)?0?~?2147483647


????BigIntegerField(IntegerField):

????????-?長(zhǎng)整型(有符號(hào)的)?-9223372036854775808?~?9223372036854775807


????BooleanField(Field)

????????-?布爾值類型


????NullBooleanField(Field):

????????-?可以為空的布爾值


????CharField(Field)

????????-?字符類型

????????-?必須提供max_length參數(shù), max_length表示字符長(zhǎng)度


????TextField(Field)

????????-?文本類型


????EmailField(CharField):

????????-?字符串類型,Django Admin以及ModelForm中提供驗(yàn)證機(jī)制


????IPAddressField(Field)

????????-?字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 IPV4 機(jī)制


????GenericIPAddressField(Field)

????????-?字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 Ipv4和Ipv6

????????-?參數(shù):

????????????protocol,用于指定Ipv4或Ipv6,?'both',"ipv4","ipv6"

????????????unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時(shí)候,可解析為192.0.2.1,開啟刺功能,需要protocol="both"


????URLField(CharField)

????????-?字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 URL


????SlugField(CharField)

????????-?字符串類型,Django Admin以及ModelForm中提供驗(yàn)證支持 字母、數(shù)字、下劃線、連接符(減號(hào))


????CommaSeparatedIntegerField(CharField)

????????-?字符串類型,格式必須為逗號(hào)分割的數(shù)字


????UUIDField(Field)

????????-?字符串類型,Django Admin以及ModelForm中提供對(duì)UUID格式的驗(yàn)證


????FilePathField(Field)

????????-?字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能

????????-?參數(shù):

????????????????path,????????????????????? 文件夾路徑

????????????????match=None,??????????????? 正則匹配

????????????????recursive=False,?????????? 遞歸下面的文件夾

????????????????allow_files=True,????????? 允許文件

????????????????allow_folders=False,?????? 允許文件夾


????FileField(Field)

????????-?字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄

????????-?參數(shù):

????????????upload_to?=?""????? 上傳文件的保存路徑

????????????storage?=?None?存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStorage


????ImageField(FileField)

????????-?字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄

????????-?參數(shù):

????????????upload_to?=?""????? 上傳文件的保存路徑

????????????storage?=?None?存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStorage

????????????width_field=None,?? 上傳圖片的高度保存的數(shù)據(jù)庫字段名(字符串)

????????????height_field=None?上傳圖片的寬度保存的數(shù)據(jù)庫字段名(字符串)


????DateTimeField(DateField)

????????-?日期+時(shí)間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]


????DateField(DateTimeCheckMixin, Field)

????????-?日期格式????? YYYY-MM-DD


????TimeField(DateTimeCheckMixin, Field)

????????-?時(shí)間格式????? HH:MM[:ss[.uuuuuu]]


????DurationField(Field)

????????-?長(zhǎng)整數(shù),時(shí)間間隔,數(shù)據(jù)庫中按照bigint存儲(chǔ),ORM中獲取的值為datetime.timedelta類型


????FloatField(Field)

????????-?浮點(diǎn)型


????DecimalField(Field)

????????-?10進(jìn)制小數(shù)

????????-?參數(shù):

????????????max_digits,小數(shù)總長(zhǎng)度

????????????decimal_places,小數(shù)位長(zhǎng)度


????BinaryField(Field)

????????-?二進(jìn)制類型


#注意:這些操作,如果是直接用數(shù)據(jù)庫操作語句進(jìn)行添加的話,不會(huì)有報(bào)錯(cuò)或是警告之類的信息

????????#但是如果換到后臺(tái)管理頁面上,進(jìn)行添加則會(huì)有相應(yīng)的警告!


常用字段類型:

????字符串:

????????EmailField(CharField):

????????IPAddressField(Field)

????????URLField(CharField)

????????SlugField(CharField)

????????UUIDField(Field)

????????FilePathField(Field)

????????FileField(Field)

????????ImageField(FileField)

????????CommaSeparatedIntegerField(CharField)

????時(shí)間類:

????????models.DateTimeField(null=True)

????數(shù)字:

????????num?=?models.IntegerField()

????????num?=?models.FloatField()

????????mum?=?models.DecimalField(max_digits=30,decimal_places=10)?#精確的小數(shù)類型

????枚舉(Django):?#應(yīng)用于固定的,百年不修改一次的選項(xiàng),例如:性別

????????color_list?=?(

????????????(1,'黑色'),

????????????(2,'白色'),

????????????(3,'藍(lán)色')

????????)

????????color?=?models.IntegerField(choices=color_list)


????????1.?自己操作:

????????????自己取,自己用

????????2.?給Django admin使用


????????應(yīng)用場(chǎng)景:選項(xiàng)固定


????????*PS: 外鍵應(yīng)用于經(jīng)常發(fā)生變動(dòng)的選項(xiàng)!FK選項(xiàng)動(dòng)態(tài)


參數(shù):

????字段參數(shù):

????????null=True,

????????default='1111',

????????db_index=True,

????????unique=True,

????????max_length=xxx 表示字符長(zhǎng)度

????????primary_key=?True?主鍵


????????class?Meta:?# 用于創(chuàng)建多列間的組合操作

????????????# unique_together = ( #創(chuàng)建有關(guān)聯(lián)的聯(lián)合唯一索引

????????????#???? ('email','ctime'),

????????????# )

????????????# index_together = (? #創(chuàng)建普通的索引

????????????#???? ('email','ctime'),

????????????# )


????DjangoAdmin提供的參數(shù):

????????verbose_name??????? Admin中顯示的字段名稱

????????blank?????????????? Admin中是否允許用戶輸入為空

????????editable??????????? Admin中是否可以編輯

????????help_text?????????? Admin中該字段的提示信息

????????choices???????????? Admin中顯示選擇框的內(nèi)容,用不變動(dòng)的數(shù)據(jù)放在內(nèi)存中從而避免跨表操作

????????????????????????????如:gf?=?models.IntegerField(choices=[(0,?'何穗'),(1,?'大表姐'),],default=1)


????????error_messages????? 自定義錯(cuò)誤信息(字典類型),從而定制想要顯示的錯(cuò)誤信息;

????????????????????????????字典健:null, blank, invalid, invalid_choice, unique,?and?unique_for_date

????????????????????????????如:{'null':?"不能為空.",?'invalid':?'格式錯(cuò)誤'}


????????validators????????? 自定義錯(cuò)誤驗(yàn)證(列表類型),從而定制想要的驗(yàn)證規(guī)則

????????????from?django.core.validators?import?RegexValidator

????????????from?django.core.validators?import?EmailValidator,URLValidator,DecimalValidator,\

????????????MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator

????????????如:

????????????????test?=?models.CharField(

????????????????????max_length=32,

????????????????????error_messages={

????????????????????????'c1':?'優(yōu)先錯(cuò)信息1',

????????????????????????'c2':?'優(yōu)先錯(cuò)信息2',

????????????????????????'c3':?'優(yōu)先錯(cuò)信息3',

????????????????????},

????????????????????validators=[

????????????????????????RegexValidator(regex='root_\d+', message='錯(cuò)誤了', code='c1'),

????????????????????????RegexValidator(regex='root_112233\d+', message='又錯(cuò)誤了', code='c2'),

????????????????????????EmailValidator(message='又錯(cuò)誤了', code='c3'), ]


***注意點(diǎn):關(guān)于字段:???????????????????????????????????

????a. 直接通過數(shù)據(jù)庫操作語句創(chuàng)建的話,不會(huì)報(bào)錯(cuò)!

????????models.Userinfo.objects.create(....)

????????--?ModelForm

????b. 但是字段會(huì)影響Django自帶的管理工具admin,不是該字段類型的數(shù)據(jù),即刻報(bào)錯(cuò)!??



PS:其他

1、自定義無符號(hào)整數(shù)字段

????class?UnsignedIntegerField(models.IntegerField):

????????def?db_type(self, connection):

????????????return?'integer UNSIGNED'


????PS: 返回值為字段在數(shù)據(jù)庫中的屬性,Django字段默認(rèn)的值為:

????????'AutoField':?'integer AUTO_INCREMENT',

????????'BigAutoField':?'bigint AUTO_INCREMENT',

????????'BinaryField':?'longblob',

????????'BooleanField':?'bool',

????????'CharField':?'varchar(%(max_length)s)',

????????'CommaSeparatedIntegerField':?'varchar(%(max_length)s)',

????????'DateField':?'date',

????????'DateTimeField':?'datetime',

????????'DecimalField':?'numeric(%(max_digits)s, %(decimal_places)s)',

????????'DurationField':?'bigint',

????????'FileField':?'varchar(%(max_length)s)',

????????'FilePathField':?'varchar(%(max_length)s)',

????????'FloatField':?'double precision',

????????'IntegerField':?'integer',

????????'BigIntegerField':?'bigint',

????????'IPAddressField':?'char(15)',

????????'GenericIPAddressField':?'char(39)',

????????'NullBooleanField':?'bool',

????????'OneToOneField':?'integer',

????????'PositiveIntegerField':?'integer UNSIGNED',

????????'PositiveSmallIntegerField':?'smallint UNSIGNED',

????????'SlugField':?'varchar(%(max_length)s)',

????????'SmallIntegerField':?'smallint',

????????'TextField':?'longtext',

????????'TimeField':?'time',

????????'UUIDField':?'char(32)',


注意事項(xiàng)

????1.觸發(fā)Model中的驗(yàn)證和錯(cuò)誤提示有兩種方式:

????????a. Django Admin中的錯(cuò)誤信息會(huì)優(yōu)先根據(jù)Admiin內(nèi)部的ModelForm錯(cuò)誤信息提示,如果都成功,才來檢查Model的字段并顯示指定錯(cuò)誤信息

????????b. 使用ModelForm

????????c. 調(diào)用Model對(duì)象的 clean_fields 方法,如:

????????????# models.py

????????????class?UserInfo(models.Model):

????????????????nid?=?models.AutoField(primary_key=True)

????????????????username?=?models.CharField(max_length=32)


????????????????email?=?models.EmailField(error_messages={'invalid':?'格式錯(cuò)了.'})


????????????# views.py

????????????def?index(request):

????????????????obj?=?models.UserInfo(username='11234', email='uu')

????????????????try:

????????????????????print(obj.clean_fields())

????????????????except?Exception as e:

????????????????????print(e)

????????????????return?HttpResponse('ok')


???????????# Model的clean方法是一個(gè)鉤子,可用于定制操作,如:上述的異常處理。


????2.Admin中修改錯(cuò)誤提示

????????# admin.py

????????from?django.contrib?import?admin

????????from?model_club?import?models

????????from?django?import?forms



????????class?UserInfoForm(forms.ModelForm):

????????????age?=?forms.IntegerField(initial=1, error_messages={'required':?'請(qǐng)輸入數(shù)值.',?'invalid':?'年齡必須為數(shù)值.'})


????????????class?Meta:

????????????????model?=?models.UserInfo

????????????????# fields = ('username',)

????????????????fields?=?"__all__"

????????????????exclude?=?['title']

????????????????labels?=?{?'name':'Writer', }

????????????????help_texts?=?{'name':'some useful help text.',}

????????????????error_messages={?'name':{'max_length':"this writer name is too long"} }

????????????????widgets={'name':Textarea(attrs={'cols':80,'rows':20})}


????????class?UserInfoAdmin(admin.ModelAdmin):

????????????form?=?UserInfoForm


????????admin.site.register(models.UserInfo, UserInfoAdmin)


django amdin是django提供的一個(gè)后臺(tái)管理頁面,改管理頁面提供完善的html和css,

????使得你在通過Model創(chuàng)建完數(shù)據(jù)庫表之后,就可以對(duì)數(shù)據(jù)進(jìn)行增刪改查,

????而使用django admin 則需要以下步驟:

????????1、創(chuàng)建后臺(tái)管理員

????????2、配置url

????????3、注冊(cè)和配置django admin后臺(tái)管理頁面


舉例:app01項(xiàng)目下:

1、在models.py文件中創(chuàng)建ORM對(duì)象

????from?django.db?import?models

????from?django.core.validators?import?RegexValidator

????from?django.core.validators?import?EmailValidator,URLValidator,DecimalValidator,\

????????MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator


????# Create your models here.

????class?UserAdmin(models.Model):

????????username?=?models.CharField(max_length=32,)

????????password?=?models.CharField(max_length=64,)


????class?UserInfo(models.Model):

????????username?=?models.CharField(max_length=32,verbose_name="用戶名",editable=True,help_text="請(qǐng)輸入你的姓名")

????????email?=?models.EmailField(null=True,unique=True,

??????????????????????????????????blank=True,verbose_name="郵箱",editable=True,help_text="請(qǐng)輸入郵箱,like:111@163.com")

????????# default = "111@163.com"

????????datetime?=models.DateField(null=True)?#只有年月日 一個(gè)日期的選擇框

????????ctime?=?models.DateTimeField(null=True,verbose_name="時(shí)間")?#年月日,時(shí)分秒 兩個(gè)選擇框

????????six_list?=?(

????????????(1,"男"),

????????????(2,"女"),

????????)

????????six?=?models.IntegerField(choices=six_list,verbose_name="性別")?#以下拉框的形式在頁面展示

????????test?=?models.CharField(verbose_name="錯(cuò)誤測(cè)試",

????????????max_length=32,

????????????error_messages={

????????????????'c1':?'輸入信息的格式不正確!',

????????????},#用于定制想要顯示的錯(cuò)誤信息,優(yōu)先級(jí)高于validators,字典類型,通過鍵值對(duì)匹配,key是validators中code設(shè)置的名字!

????????????validators=[RegexValidator(regex='root_\d+', message='錯(cuò)誤了', code='c1')],

????????????#正則匹配輸入的字符串,如果不滿足規(guī)則就會(huì)提示錯(cuò)誤信息,若沒有error_messages插足,就顯示自己的錯(cuò)誤信息

????????????null=True,

????????)


2、在admin.py中執(zhí)行如下配置,用于操作創(chuàng)建的數(shù)據(jù)庫表

????from?django.contrib?import?admin

????from?app01?import?models

????admin.site.register(models.UserInfo)


????-?創(chuàng)建后臺(tái)管理員:

????????????python3 manage.py createsuperuser

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容