models的字段,也就是我们定义的数据库表结构中的字段,可以有不同的类型,通过类型不同可以实现以下功能: - 不同类型的字段对应的数据库表字段具有不同类型(与数据库支持的数据类型相互对应)。 - 在网页上渲染生成对应的html元素,根据字段类型选择生成input、select、textarea等。 - 进行表单的有效性验证,例如email格式是否正确等。 - 注意,定义字段时,不要使用python的关键字和保留字,不能使用连续多个下划线。
Django内置数十种字段类型,可以查看模型字段参考文档,还可以编写自定义的字段类型。
模型的字段类型表
字段类型 | 简单介绍 |
---|---|
AutoField | class AutoField(**options),根据id自动增长的整数型字段,因为django会默认添加id自增主键 |
BigAutoField | class BigAutoField(**options),与AutoField作用相似,但是长度为64bit ,id最大可以到9223372036854775807 |
BigIntegerField | class BigIntegerField(**options)与BigAutoField相似, 能表示-9223372036854775808到9223372036854775807. |
BinaryField | class BinaryField(max_length=None, **options)用来存储二进制数据 |
BooleanField | class BooleanField(**options) 布尔型字段,用来表示true或者false,与页面元素 CheckboxInput关联。 |
CharField | class CharField(max_length=None, **options)用来存储字符串的字段,需要参数max_length定义字段的长度,页面form表单为TextInput,如果存储数据很大使用TextField |
DateField | class DateField(auto_now=False, auto_now_add=False, **options)时间类型存储年月日,可以通过 datetime.date进行赋值。 |
DateTimeField | class DateTimeField(auto_now=False, auto_now_add=False, **options)日期和时间,可以通过python的datetime.datetime 实例化。 |
DecimalField | class DecimalField(max_digits=None, decimal_places=None, **options)实例表示固定精度的十进制数的字段,max_digits是数字允许的最大位数,decimal_places是小数的最大位数,例:max_digits=3, decimal_places=2 |
DurationField | 存储时间段的字段 ,通过timedelta进行实例化,models.DurationField(default=timedelta()) |
EmailField | class EmailField(max_length=254, **options),用来存储邮箱字符串,可以验证邮箱格式是否有效 |
FileField | class FileField(upload_to=None, max_length=100, **options)用于上传存储文件,需要配置 MEDIA_ROOT(此目录用于存储上传的文件),example: upload = models.FileField(upload_to='uploads/%Y/%m/%d/') |
FilePathField | class FilePathField(path=None, match=None, recursive=False, max_length=100, **options) 一个字符串字段,用于代表文件系统中的文件,path参数不能缺少 |
FloatField | class FloatField(**options) 通过python的float进行实例化,用于存储浮点数 |
ImageField | class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options) 用于图片上传的字段 |
IntegerField | 整数类型字段。值范围为-2147483648到2147483647 |
GenericIPAddressField | 用于存储IP的格式化字符串,支持ipv4 ipv6 |
NullBooleanField | 与BooleanField相似的布尔型字段,默认null=True |
PositiveIntegerField | 正整数范围0-2147483647 |
PositiveSmallIntegerField | 正整数,范围0到32767 |
SlugField | class SlugField(max_length=50, **options) 常用来存储url,只包含字母、数字、下划线或连字符 |
SmallAutoField | 范围 1到32767 |
SmallIntegerField | 与 IntegerField类似,范围-32768到2767 |
TextField | 一个大的文本字段。这个字段的默认表单小部件是一个Textarea |
TimeField | class TimeField(auto_now=False, auto_now_add=False, **options) ,通过datetime.time实例化,存储时间 |
URLField | class URLField(max_length=200, **options) ,用于存储url,可以进行表单格式验证 |
UUIDField | 用于存储uuid,example: id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) |
ForeignKey | class ForeignKey(to, on_delete, **options) 多对一的关系,多个表之间数据的关联关系(例如:用户表和组表之间,用户属于某个组)。需要两个位置参数:被关联的类和 on_delete 选项 |
ManyToManyField | class ManyToManyField(to, **options),表之间多对多的关系字段 |
OneToOneField | 表与表之间一对一的关联字段 |
自定义 | 你可以自己定义字段类型 |
上面的表格列举了django内置的字段类型,同时这些字段有很多选项可以配置,用来确定字段的默认值,最大长度,是否允许为null等,下面介绍常用的通用字段选项。
选项 | 作用 |
---|---|
null | 如果设置null=True,Django 会将数据库中该字段设置为 NULL。默认为 False,用于表示存储在数据库中的字段时候有值 |
blank | 如果blank=True,该字段允许为空。默认为 False。用于表示用户从网页提交的表单是否可以为空 |
choices | 一系列二元组,用作此字段的选项。如果提供了二元组,默认表单小部件是一个选择框,而不是标准文本字段,并将限制给出的选项。例子:YEAR_IN_SCHOOL_CHOICES = [('F', 'Freshman'),('S', 'Sophomore'),] shirt_size = models.CharField(max_length=1, choices=YEAR_IN_SCHOOL_CHOICES) |
default | 用于设置字段的默认值,对表新增一个字段时需要设置default,用来为历史数据进行初始化;或者新增数据的默认值 |
help_text | 用于前段表单提示 |
primary_key | 主键 |
unique | 唯一键,表示不能有重复字段 |
verbose_name | 用于对字段进行说明备注,example:sites = models.ManyToManyField(Site, verbose_name="list of sites") |
举例:url=models.CharField(max_length=100,default='#',verbose_name='url连接')
django的models的元数据meta用来定义表的额外信息,例如数据库中表的名字,默认查询数据集的排序,表模型在后台中显示的中文名称等。 下载介绍meta相关配置选项。
配置格式:
from django.db import models
class Ox(models.Model):
horn_length = models.IntegerField()
class Meta:
ordering = ["horn_length"]
verbose_name_plural = "oxen"
目前django3有24个meta可配置的选项,2个只读选项,下面对部分选项进行说明:
选项名 | 作用 |
---|---|
db_table='' | 用于修改数据库表名,默认表名为appname_modelname |
ordering | 查询返回结果,按照指定的字段进行排序 |
verbose_name='' | 表名称的直观表示,增加可读性 |
abstract = True | 是否把模型设置为基类,基类不会创建表结构,用于生成新的类对象 |
indexes | 索引选项,用于表的索引,例子:indexes = [models.Index(fields=['last_name', 'first_name']), models.Index(fields=['first_name'], name='first_name_idx'),] |
为模型添加自己的方法或者重写默认的方法(例如save())
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
birth_date = models.DateField()
def baby_boomer_status(self):
"Returns the person's baby-boomer status."
import datetime
if self.birth_date < datetime.date(1945, 8, 1):
return "Pre-boomer"
elif self.birth_date < datetime.date(1965, 1, 1):
return "Baby boomer"
else:
return "Post-boomer"
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
if self.name == "Yoko Ono's blog":
return # Yoko shall never have her own blog!
else:
super().save(*args, **kwargs) # Call the "real" save() method.
总结:至此讲解了django的模型的基本内容,关于模型继承相关的内容(抽象基类,多表继承,代理模型等)这里不做介绍。后面章节开始介绍models的查询相关操作。