django模型类-字段,属性

模型

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

模型是有关您的数据的唯一、明确的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型都映射到单个数据库表。

基础知识:

  • 每个模型都是一个 Python 类,它是 继承于django.db.models.Model.
  • 模型的每个属性代表一个数据库字段。

1.示例

这个示例模型定义了一个Person,它有一个first_namelast_name

from django.db import models
​
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
复制代码

first_namelast_name是模型的字段。每个字段都被指定为一个类属性,每个属性都映射到一个数据库列。

上面的Person模型将创建一个这样的数据库表:

CREATE TABLE app_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);
复制代码

说明:

  • 会在数据库中生成一个 app_person (自己注册的app名),这个数据库名称可以被db_table覆盖

    • db_table = 'test_person'
      复制代码
  • 我们没有创建id字段,但是会帮我们默认加上,但这个id也可以被覆盖

    • id = models.BigAutoField(primary_key=True)
      复制代码

2.使用模型

我们在定义好模型类后,就要对它进行迁移,到数据库

python manage.py makemigrations # 生成迁移文件,都放在migrations中,
python manage.py migrate # 迁移,迁移成功会在数据库中有记录
复制代码

注意:

如果我们没有在settings.py中的INSTALLED_APPS进行注册的话,就不会对其进行迁移。使用一定不要忘了

INSTALLED_APPS = [
    ...
    'app',  # 自己使用startapp注册的
    ...
]
复制代码

3.字段类型

下表列出了所有Django内置的字段类型,但不包括关系字段类型(字段名采用驼峰命名法,初学者请一定要注意):

类型 说明
AutoField 一个自动增加的整数类型字段。通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为primary_key=True。Django在一个模型中只允许有一个自增字段,并且该字段必须为主键!
BigAutoField 64位整数类型自增字段,数字范围更大,从1到9223372036854775807
BigIntegerField 64位整数字段(看清楚,非自增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个NumberInput标签。
BinaryField 存储原始二进制数据的字段。
BooleanField 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果设置了参数null=True,则表现为NullBooleanSelect选择框。可以提供default参数值,设置默认值。
CharField 最常用的类型,字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是text input。
DateField auto_now:保存对象时自动将字段设置为现在(当前时间) auto_now_add:首次创建对象时自动将字段设置为现在。用于创建时间戳
DateTimeField 日期和时间,在 Python 中由datetime.datetime实例表示。
DecimalField 一个固定精度的十进制数,在 Python 中由一个 Decimal实例表示。有两个必需的参数
DurationField 用于存储时间段的字段
EmailField 使用CharField来检查该值是否为有效电子邮件地址
FileField 文件上传字段。
FilePathField 文件路径类型,后面单独介绍
FloatField 浮点数类型,对应Python的float。参考整数类型字段。
ImageField 图像类型,后面单独介绍。
IntegerField 整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput或者TextInput标签。
GenericIPAddressField class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options),IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4。在HTML中表现为TextInput标签。参数protocol默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。
JSONField JSON类型字段。Django3.1新增。签名为class JSONField(encoder=None,decoder=None,**options)。其中的encoder和decoder为可选的编码器和解码器,用于自定义编码和解码方式。如果为该字段提供default值,请务必保证该值是个不可变的对象,比如字符串对象。
PositiveBigIntegerField 正的大整数,0到9223372036854775807
PositiveIntegerField 正整数,从0到2147483647
PositiveSmallIntegerField 较小的正整数,从0到32767
SlugField slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs中。可以设置max_length参数,默认为50。
SmallAutoField Django3.0新增。类似AutoField,但是只允许1到32767。
SmallIntegerField 小整数,包含-32768到32767。
TextField 用于储存大量的文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。
TimeField 时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒。
URLField 一个用于保存URL地址的字符串类型,默认最大长度200。
UUIDField 用于保存通用唯一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品,后面有例子展示。

4.关系字段

ForeignKey 一对多
OneToOneField 一对一
ManyToManyField 多对多

5.字段选项

null 如果True,可以存储空值。默认为False。
blank 如果True,则允许该字段为空。默认为False(True表单验证将允许输入空值)
choices CHOICES = [ ('SR', 'Senior'), ('GR', 'Graduate'), ] 每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是可读的名称
db_column 用于此字段的数据库列的名称。如果没有给出, 将使用该字段的名称。
db_index 如果True,将为此字段创建数据库索引。
db_tablespace 用于此字段索引的[数据库表空间的名称(如果此字段已编入索引)。默认值是项目的 `DEFAULT_INDEX_TABLESPACE设置(如果已设置)或 db_tablespace模型的设置(如果有)。如果后端不支持索引表空间,则忽略此选项。
default 字段的默认值
editable 如果是False,该字段将不会 ModelForm中。在模型验证期间它们也会被跳过。默认为True
error_messages error_messages参数允许您覆盖该字段将引发的错误默认消息
help_text 与表单小部件一起显示的额外“帮助”文本。即使您的字段未在表单上使用,它也可用于文档。
primary_key 如果True,则该字段是模型的主键
unique 如果True,则该字段在整个表中必须是唯一的。
verbose_name 字段的可读名称。如果没有给出详细名称,Django 将使用字段的属性名称自动创建它,将下划线转换为空格

\

猜你喜欢

转载自juejin.im/post/6992354581476966431