这篇笔记介绍的 field options,也就是 字段的选项属性。

首先,关于 model,是数据库与 python 代码里的一个映射关系,每一个 model 是django.db.models.Model 的一个子类。

model 里每一个属性值(即字段)代表数据库的字段,通过 定义 models.py 里的 class,可以自动生成数据库里的表和字段,比如之前的 Question。

主键 id 字段如果不手动设置都会默认创建。

比如下面这个 model,我们将以此为例介绍各个字段的属性值:

class Question(models.Model):
SiZES = [
('S', 'small'),
('M', 'medium'),
("L", 'large'),
]
question_text = models.CharField(verbose_name="问题文字", max_length=200, help_text="question_text")
pub_date = models.DateTimeField('日期')
test_blank_char = models.CharField(blank=True, max_length=100)
size = models.CharField(max_length=10, choices=SiZES)

目录大致如下:

  1. null=True/False
  2. default
  3. blank=True/False
  4. primary_key
  5. unique
  6. verbose_name
  7. db_index
  8. auto_now
  9. auto_now_add
  10. choices

1、null=True/False

是否允许字段在数据库的字段为 null。

这个字段一般可以和下面的 default 默认值配合使用

2、default

字段的默认值

有时候创建一条数据的时候,指定了其他字段的值,该字段不指定,那么系统就会给这个字段赋值为 default 的值,可以是 任意值,比如整型,字符型,日期,以及 None。

比如下面的model:

class Question(models.Model):
name = models.CharField(max_length=20, default='')
pub_date = models.DateField()

创建一条数据:

Question.objects.create(pub_date="2022-01-01")

创建数据的时候没有指定 name 的值,而我们设置了 default 为 空字符串,那么系统创建这条数据的时候,就会默认为 该字段赋值为 ''

而如果我们设置了 default=None,表示默认为 null(数据库的空值),系统会报错,因为字段一般默认是不允许为空的,所以我们需要和 null=True 配合使用,示例如下:

class Question(models.Model):
name = models.CharField(max_length=20, default=None, null=True)
pub_date = models.DateField()

那么当我们创建一条数据的时候,如果不指定 name 的值,name 字段在数据库中就会默认为 null 了。

3、blank=True/False

blank 是空白,表示空字符串,字段是否允许为空字符串

4、primary_key

是否为主键

因为我们创建表的时候,比如上面那个 Question,一般不设置主键 id,系统为自动默认为我们创建一个主键为 id 的自增的整型数据。

5、unique

唯一约束

设置为 unique=True 后,该表会为该字段中建立一个唯一索引,该字段数据在该表中就只能是唯一的了,不可创建相同内容的数据了,否则会报错。

class Question(models.Model):
name = models.CharField(max_length=20, unique=True)
pub_date = models.DateField()

比如我们创建了一条数据,name 的值为 'hunter',然后再创建一条 name 为 'hunter' 的数据,系统就会报错。

6、verbose_name

name = models.CharField(max_length=20, default=None, null=True, verbose_name='名称')

字段注释,除了可用于用户的查看理解字段含义,还可在 admin 页面数据该字段的标题显示(admin后台管理页面后续会开一篇笔记介绍)

7、db_index

索引

设置字段的这个参数为 True,然后运行 makemigrations 和 migrate 会为数据库的该字段创建索引

name = models.CharField(max_length=20, default=None, null=True, verbose_name='名称', db_index=True)

8、auto_now

常用于日期字段,每次更改该数据行的字段的内容时,该字段会自动更新为当前时间,常用于 updated_time 字段

示例:

updated_time = models.DateTimeField(auto_now=True)

9、auto_now_add

常用于日期字段,每次创建该数据行数据之后,该字段会被自动填入当前时间,且之后更改数据时不会变化,常用于 created_time 字段

示例:

created_time = models.DateTimeField(auto_now_add=True)

10、choices

字段可选值

常用于某个字段的只能选择特定的几个值的情况下,比如状态为 成功,失败,待处理这种。

下面是一个使用示例:

class Question(models.Model):
SiZES = [
('S', 'small'),
('M', 'medium'),
('L', 'large'),
]
question_text = models.CharField(verbose_name="问题文字", max_length=200)
pub_date = models.DateTimeField('日期')
test_blank_char = models.CharField(blank=True, max_length=100)
size = models.CharField(max_length=10, choices=SiZES)

系统在保存的时候 使用的是 choices 中每一个元素的第一个值,也就是 SIZES 里的 ’S’ ‘M’, ‘L’

如果在项目中想要获取该字段对应的全称,可以使用 get_field_display() 方法,其中,field 为我们定义的字段名

比如在上面的 model 里,是 get_size_display()

官方的做法是 在 model 的类里面,定义一个 CHOICES,然后定义对于每个值定义一个合适的常量

以下是官方的一个示例:

class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
GRADUATE = 'GR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
(GRADUATE, 'Graduate'),
]
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)

以上就是本篇笔记全部内容,主要介绍的是字段里的选项,下一篇笔记将介绍字段的类型,比如 IntegerField, CharField等等

原文链接:Django笔记四之字段选项

本文首发于本人微信公众号:Django笔记。

如果想获取更多相关文章,可扫码关注阅读:

Django笔记四之字段属性的更多相关文章

  1. MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...

  2. 【Django笔记四】Django2.0中的表单

    一.环境版本信息: 操作系统:windows10 Django版本:2.0.5 Python版本:3.6.4 Mysql版本: 5.5.53   安装mysql 二.基础信息 1.App中的模型mod ...

  3. Python - Django - ORM 常用的字段属性

    字段参数: null:用于表示某个字段可以为空 unique:如果设置为 unique=True,则该字段在此表中必须是唯一的 db_index:如果 db_index=True,则代表着为此字段设置 ...

  4. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  5. Django之Models进阶操作(字段属性)

    字段属性详细介绍 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列, ...

  6. Django笔记&教程 4-2 模型(models)中的Field(字段)

    Django 自学笔记兼学习教程第4章第2节--模型(models)中的Field(字段) 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/ref ...

  7. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

  8. Django开发笔记四

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...

  9. Django聚合查询 orm字段及属性

    目录 一 聚合查询 1. 级联 级联删除 级联更新 2. 聚合函数 使用 aggregate 使用场景 3. 分组查询 语法 使用 annotate 代码 4. F与Q查询 F查询 Q查询 二 ORM ...

  10. Django(七)模型:字段属性、字段选项(参数)

    一.模型类属性命名限制 参考:https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/ 1)不能是python的保留关键字. 2)不允许 ...

随机推荐

  1. C++ OnlineJudge

    基本输入输出 1.接收多行数据,直到文件末尾 1 #include <iostream> 2 //#include <bits/stdc++.h> 3 #include < ...

  2. Dos基本命令及批处理

    如何操作DOS命令: 开始----运行----cmd----回车: win+R------运行----cmd----回车: 基本命令: 1.命令:color f0 color ?  寻求帮助 改变背景 ...

  3. 20202411 2020-2021-2 《Python程序设计》实验一报告

    20202411 2020-2021-2 <Python程序设计>实验一报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...

  4. Apple Sources

    1. libsystem_malloc.dylib的源码 https://opensource.apple.com/tarballs/libmalloc/ .这里有多个版本(例如用otool找到iOS ...

  5. cin和缓存区问题

    稍微记录一下今天刷题遇到的C++问题 看到使用while(cin >> s);来读取最后一个字符串.百度了一下发现cin以空格,制表符和回车为终止依据.也就是说我输入"abc 1 ...

  6. Jupyter lab 切换kernel

    在使用pytorch的时候需要用到pandas这个包,报错说"no module named pandas", 但是我在终端查找了conda 装了pandas,所以不是安装的问题, ...

  7. c# WinForm 多次点击这个按钮会弹出多个窗体, 怎么才能只显示一个窗体。解决方案!

    第一种解决方法 "单例" <mark> 书上有 private void toolStripLabel1_Click(object sender, EventArgs ...

  8. Chorme 兼容

    Chorme自动更新,不知道什么时候版本 就变了.之前好用的代码,突然不好用了. 启动时提示Only local connections are allowed 检查一下兼容性参照下文,下载对应的Dr ...

  9. Java8中Stream的用法

    Java8中Stream的用法 1.概述 Stream APl ( java.util.stream)把真正的函数式编程风格引入到Java中.这是目前为止对Java类库最好的补充,因为Stream A ...

  10. python3GUI--轮播图效果展示By:PyQt5(附源码下载地址)

    @ 目录 一.前言 二.展示 1.酷我音乐 2.QQ飞车 3.虎牙 4.网易云音乐 5.英雄联盟 6.英雄联盟(Pro) 7.腾讯视频 三.源代码 1.demo02GUI.py 2.engine.py ...