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