django -- models数据库操作---字段及参数

models操作  - - - -  字段 及 参数
 
所有字段类型:
     AutoField(Field)
         -  int 自增列,必须填入参数 primary_key = True
 
     BigAutoField(AutoField)
         -  bigint自增列,必须填入参数 primary_key = True
 
         注:当model中如果没有自增列,则自动会创建一个列名为 id 的列
         from  django.db  import  models
 
         class  UserInfo(models.Model):
             # 自动创建一个列名为id的且为自增的整数列
             username  =  models.CharField(max_length = 32 )
 
         class  Group(models.Model):
             # 自定义自增列
             nid  =  models.AutoField(primary_key = True )
             name  =  models.CharField(max_length = 32 )
 
     SmallIntegerField(IntegerField):
         -  小整数  - 32768  ~  32767
 
     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         -  正小整数  0  ~  32767
     IntegerField(Field)
         -  整数列(有符号的)  - 2147483648  ~  2147483647
 
     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         -  正整数  0  ~  2147483647
 
     BigIntegerField(IntegerField):
         -  长整型(有符号的)  - 9223372036854775808  ~  9223372036854775807
 
     BooleanField(Field)
         -  布尔值类型
 
     NullBooleanField(Field):
         -  可以为空的布尔值
 
     CharField(Field)
         -  字符类型
         -  必须提供max_length参数, max_length表示字符长度
 
     TextField(Field)
         -  文本类型
 
     EmailField(CharField):
         -  字符串类型,Django Admin以及ModelForm中提供验证机制
 
     IPAddressField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
 
     GenericIPAddressField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
         -  参数:
             protocol,用于指定Ipv4或Ipv6,  'both' , "ipv4" , "ipv6"
             unpack_ipv4, 如果指定为 True ,则输入::ffff: 192.0 . 2.1 时候,可解析为 192.0 . 2.1 ,开启刺功能,需要protocol = "both"
 
     URLField(CharField)
         -  字符串类型,Django Admin以及ModelForm中提供验证 URL
 
     SlugField(CharField)
         -  字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
 
     CommaSeparatedIntegerField(CharField)
         -  字符串类型,格式必须为逗号分割的数字
 
     UUIDField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
 
     FilePathField(Field)
         -  字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
         -  参数:
                 path,                      文件夹路径
                 match = None ,                正则匹配
                 recursive = False ,           递归下面的文件夹
                 allow_files = True ,          允许文件
                 allow_folders = False ,       允许文件夹
 
     FileField(Field)
         -  字符串,路径保存在数据库,文件上传到指定目录
         -  参数:
             upload_to  =  ""      上传文件的保存路径
             storage  =  None       存储组件,默认django.core.files.storage.FileSystemStorage
 
     ImageField(FileField)
         -  字符串,路径保存在数据库,文件上传到指定目录
         -  参数:
             upload_to  =  ""      上传文件的保存路径
             storage  =  None       存储组件,默认django.core.files.storage.FileSystemStorage
             width_field = None ,   上传图片的高度保存的数据库字段名(字符串)
             height_field = None    上传图片的宽度保存的数据库字段名(字符串)
 
     DateTimeField(DateField)
         -  日期 + 时间格式 YYYY - MM - DD HH:MM[:ss[.uuuuuu]][TZ]
 
     DateField(DateTimeCheckMixin, Field)
         -  日期格式      YYYY - MM - DD
 
     TimeField(DateTimeCheckMixin, Field)
         -  时间格式      HH:MM[:ss[.uuuuuu]]
 
     DurationField(Field)
         -  长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
 
     FloatField(Field)
         -  浮点型
 
     DecimalField(Field)
         -  10 进制小数
         -  参数:
             max_digits,小数总长度
             decimal_places,小数位长度
 
     BinaryField(Field)
         -  二进制类型
 
#注意:这些操作,如果是直接用数据库操作语句进行添加的话,不会有报错或是警告之类的信息
         #但是如果换到后台管理页面上,进行添加则会有相应的警告!
 
常用字段类型:
     字符串:
         EmailField(CharField):
         IPAddressField(Field)
         URLField(CharField)
         SlugField(CharField)
         UUIDField(Field)
         FilePathField(Field)
         FileField(Field)
         ImageField(FileField)
         CommaSeparatedIntegerField(CharField)
     时间类:
         models.DateTimeField(null = True )
     数字:
         num  =  models.IntegerField()
         num  =  models.FloatField()
         mum  =  models.DecimalField(max_digits = 30 ,decimal_places = 10 )   #精确的小数类型
     枚举(Django):  #应用于固定的,百年不修改一次的选项,例如:性别
         color_list  =  (
             ( 1 , '黑色' ),
             ( 2 , '白色' ),
             ( 3 , '蓝色' )
         )
         color  =  models.IntegerField(choices = color_list)
     
         1.  自己操作:
             自己取,自己用
         2.  给Django admin使用
             
         应用场景:选项固定
         
         * PS: 外键应用于经常发生变动的选项!FK选项动态
 
参数:
     字段参数:
         null = True ,
         default = '1111' ,
         db_index = True ,
         unique = True ,
         max_length = xxx 表示字符长度
         primary_key =  True  主键
         
         class  Meta:   # 用于创建多列间的组合操作
             # unique_together = ( #创建有关联的联合唯一索引
             #     ('email','ctime'),
             # )
             # index_together = (  #创建普通的索引
             #     ('email','ctime'),
             # )
 
     DjangoAdmin提供的参数:
         verbose_name        Admin中显示的字段名称
         blank               Admin中是否允许用户输入为空
         editable            Admin中是否可以编辑
         help_text           Admin中该字段的提示信息
         choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                             如:gf  =  models.IntegerField(choices = [( 0 '何穗' ),( 1 '大表姐' ),],default = 1 )
 
         error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                             字典健:null, blank, invalid, invalid_choice, unique,  and  unique_for_date
                             如:{ 'null' "不能为空." 'invalid' '格式错误' }
 
         validators          自定义错误验证(列表类型),从而定制想要的验证规则
             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' '优先错信息1' ,
                         'c2' '优先错信息2' ,
                         'c3' '优先错信息3' ,
                     },
                     validators = [
                         RegexValidator(regex = 'root_\d+' , message = '错误了' , code = 'c1' ),
                         RegexValidator(regex = 'root_112233\d+' , message = '又错误了' , code = 'c2' ),
                         EmailValidator(message = '又错误了' , code = 'c3' ), ]
 
* * * 注意点:关于字段:                                   
     a. 直接通过数据库操作语句创建的话,不会报错!
         models.Userinfo.objects.create(....)
         - -  ModelForm
     b. 但是字段会影响Django自带的管理工具admin,不是该字段类型的数据,即刻报错!  
         
 
PS:其他
1 、自定义无符号整数字段
     class  UnsignedIntegerField(models.IntegerField):
         def  db_type( self , connection):
             return  'integer UNSIGNED'
 
     PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
         '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)' ,
 
注意事项
     1. 触发Model中的验证和错误提示有两种方式:
         a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息
         b. 使用ModelForm
         c. 调用Model对象的 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' '格式错了.' })
 
             # 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方法是一个钩子,可用于定制操作,如:上述的异常处理。
 
     2.Admin 中修改错误提示
         # 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' '请输入数值.' 'invalid' '年龄必须为数值.' })
 
             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提供的一个后台管理页面,改管理页面提供完善的html和css,
     使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,
     而使用django admin 则需要以下步骤:
         1 、创建后台管理员
         2 、配置url
         3 、注册和配置django admin后台管理页面
 
举例:app01项目下:
1 、在models.py文件中创建ORM对象
     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 = "请输入你的姓名" )
         email  =  models.EmailField(null = True ,unique = True ,
                                   blank = True ,verbose_name = "邮箱" ,editable = True ,help_text = "请输入邮箱,like:[email protected]" )
         # default = "[email protected]"
         datetime  = models.DateField(null = True )   #只有年月日 一个日期的选择框
         ctime  =  models.DateTimeField(null = True ,verbose_name = "时间" #年月日,时分秒 两个选择框
         six_list  =  (
             ( 1 , "男" ),
             ( 2 , "女" ),
         )
         six  =  models.IntegerField(choices = six_list,verbose_name = "性别" )   #以下拉框的形式在页面展示
         test  =  models.CharField(verbose_name = "错误测试" ,
             max_length = 32 ,
             error_messages = {
                 'c1' '输入信息的格式不正确!' ,
             }, #用于定制想要显示的错误信息,优先级高于validators,字典类型,通过键值对匹配,key是validators中code设置的名字!
             validators = [RegexValidator(regex = 'root_\d+' , message = '错误了' , code = 'c1' )],
             #正则匹配输入的字符串,如果不满足规则就会提示错误信息,若没有error_messages插足,就显示自己的错误信息
             null = True ,
         )
 
2 、在admin.py中执行如下配置,用于操作创建的数据库表
     from  django.contrib  import  admin
     from  app01  import  models
     admin.site.register(models.UserInfo)
     
     -  创建后台管理员:
             python3 manage.py createsuperuser

猜你喜欢

转载自blog.csdn.net/weixin_37773766/article/details/80323310