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
,
# 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