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:111@163.com")
# default = "111@163.com"
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