others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

django的模型字段

访问量:1374 创建时间:2020-01-14

字段的类型

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模型元数据meta

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'),]

django定义models模型方法

为模型添加自己的方法或者重写默认的方法(例如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的查询相关操作。

登陆评论: 使用GITHUB登陆