Django模型字段

字段选项

null

如果是 True, Django 将在数据库中存储空值为 NULL。默认为 False

避免在基于字符串的字段上使用 null,如 CharField 和 TextField。如果一个基于字符串的字段有 null=True,这意味着它有两种可能的“无数据”值。NULL,和空字符串。在大多数情况下,“无数据”有两种可能的值是多余的,Django 的惯例是使用空字符串,而不是 NULL。一个例外是当一个 CharField 同时设置了 unique=True 和 blank=True。在这种情况下,null=True 是需要的,以避免在保存具有空白值的多个对象时违反唯一约束。

无论是基于字符串的字段还是非字符串的字段,如果希望在表单中允许空值,还需要设置 blank=True,因为 null 参数只影响数据库的存储。

blank

如果是 True ,该字段允许为空。默认为 False 。

注意,这与 null 不同。 null 纯属数据库相关,而 blank 则与验证相关。如果一个字段有 blank=True,表单验证将允许输入一个空值。如果一个字段有 blank=False,则该字段为必填字段。

choice

在Django中,choices字段选项是一个非常实用的特性,它允许你为某个模型字段定义一组固定的可选值。这些选项通常会在数据库中以原始值存储,但在表单中或模板渲染时会显示为更加友好的人类可读的文本。以下是choices字段选项的几种用法定义和详细解读:

基本用法

choices是一个由二元元组组成的可迭代对象,每个元组包含两个元素:第一个元素是存储在数据库中的实际值,通常为整数或字符串;第二个元素是在表单或模板中展示给用户的内容,通常是描述性的文本。

class SexType(objects):MALE = 'M'FEMALE = 'F'UNKNOWN = 'N/A'CHOICES = ((MALE, '男'),(FEMALE, '女'),(UNKNOWN, u'未知'),)class User(models.Model):username = models.CharField(max_length=20, unique=True, verbose_name='名称')sex = models.CharField(max_length=3, default=SexType.UNKNOWN, choices=SexType.CHOICES, verbose_name='性别')

在这个例子中,size字段被限制为'S', 'M', 'L', 'XL'四个值,而用户在表单中看到的将是'Small', 'Medium', 'Large', 'Extra Large'。

在模板中的使用

一旦模型字段定义了choices,在模板中你可以使用get_FOO_display()方法来获取并显示该字段的可读文本。

<p>{{ user.get_gender_display }}</p>

这将输出person实例的gender字段对应的友好文本,比如'Male'、'Female'或'Other'。

在序列化器中的使用

class UserSerializer(serializers.ModelSerializer):sex_t = serializers.CharField(source='get_sex_display', read_only=True, required=False)#source='get_sex_display' 固定写法get_xxx_displayclass Meta:model = Userfields = ('id', 'name', 'sex', 'sex_t')序列化结果:
[{"id": 1,"name": "小明","sex": "M","sex_t": "男"},{"id": 2,"name": "小王","sex": "F","sex_t": "女"}
]

使用枚举类(Django 3.0+)

Django 3.0之后,推荐使用TextChoicesIntegerChoices枚举类来定义choices,这能提供更好的类型安全和代码可读性

from django.db import models
from django.utils.translation import gettext_lazy as _class Gender(models.TextChoices):MALE = 'M', _('Male')FEMALE = 'F', _('Female')OTHER = 'O', _('Other')class Person(models.Model):gender = models.CharField(max_length=1, choices=Gender.choices)
class Card(models.Model):class Suit(models.IntegerChoices):DIAMOND = 1SPADE = 2HEART = 3CLUB = 4suit = models.IntegerField(choices=Suit.choices)

db_index

  • 含义db_index=True 指示Django应该在数据库中为此字段创建索引。索引能够显著提高基于该字段的查询速度,尤其是在大型数据集上。然而,创建索引也会占用额外的磁盘空间,并可能略微减慢插入和更新操作的速度。
email = models.EmailField(db_index=True)

default

  • 含义default 参数指定了当创建一个新的模型实例但没有为该字段提供值时,使用的默认值。这对于给字段提供一个初始值或者在某些情况下确保字段非空非常有用。
created_at = models.DateTimeField(auto_now_add=True, default=timezone.now)

help_text

  • 含义help_text 参数用于提供关于字段的附加说明或提示信息,通常在表单或Django管理界面中展示,帮助用户更好地理解字段的用途或如何填写。
password = models.CharField(max_length=128, help_text="请输入至少8位密码")

primary_key

  • 含义primary_key=True 用于标记一个字段作为表的主键。主键是一个或多个字段的组合,用于唯一地标识表中的每一行记录。每个表只能有一个主键,且主键的值必须唯一,且不能为空(不允许NULL)。主键通常用于建立表之间的关联,以及在查询时快速定位记录。
id = models.AutoField(primary_key=True)

unique

  • 含义unique=True 表示该字段的值在表中必须是唯一的,不允许重复,但与主键不同,它可以有多个,并且可以为空(NULL)。这个选项常用于需要唯一性但不作为主键的字段,如用户邮箱。
username = models.CharField(max_length=30, unique=True)

auto_now_add

  • 用途auto_now_add=True用于在模型实例首次被创建并保存到数据库时自动设置字段的值为当前时间。这意味着该字段的值只会在记录创建时被设置一次,之后即使对象被多次保存,该字段的值也不会再发生变化。
  • 场景:它非常适合用于记录数据的创建时间,如文章的发布日期、用户注册时间等场景。
from django.db import modelsclass BlogPost(models.Model):title = models.CharField(max_length=200)created_at = models.DateTimeField(auto_now_add=True)
  • 在上述示例中,created_at字段会在博客文章首次被保存时自动填充为当前时间。

auto_now

  • 用途auto_now=True则会在每次对象被保存时自动更新该字段为当前时间。这意味着每当模型实例被修改并重新保存,该字段的值就会被更新为最新的时间。
  • 场景:适用于需要追踪记录最后修改时间的场景,如文档的最后编辑时间、用户资料的最后更新时间等
class UserProfile(models.Model):user = models.OneToOneField(User, on_delete=models.CASCADE)last_update = models.DateTimeField(auto_now=True)
  • 在这个例子中,每当用户资料被修改并保存,last_update字段的值就会被更新为当前时间。

注意事项

  • 不可手动赋值:当字段设置了auto_now_addauto_now时,通常不允许开发者直接为这些字段赋值。在使用ModelForm创建表单时,这些字段通常会被自动排除,防止用户输入。
  • 与默认值(default)的区别auto_now_addauto_nowdefault选项不同,后者仅在创建对象时如果没有为字段提供值时才生效,并且不会在每次保存时自动更新。

verbose_name

  • 含义verbose_name 参数允许你为字段提供一个更长、更易理解的名称,以提高用户体验。
date_of_birth = models.DateField(verbose_name="出生日期")

 字段类型

CharField

用途:用于存储短文本字符串,类似于数据库中的VARCHAR类型。可以指定max_length来限制字符串的最大长度。

class Author(models.Model):name = models.CharField(max_length=100)

TextField

用途:用于存储大文本数据,如文章内容、评论等,类似于数据库中的TEXT类型。

class BlogPost(models.Model):content = models.TextField()

IntegerField

用途:用于存储整数。

class Product(models.Model):stock = models.IntegerField()

FloatField

用途:用于存储浮点数。

class Product(models.Model):price = models.FloatField()

BooleanField

用途:用于存储布尔值(True或False)。

class User(models.Model):is_active = models.BooleanField(default=True)

DateField

用途:存储日期(不含时间部分)。

class DateField(auto_now=False, auto_now_add=False, **options)¶
一个日期,在 Python 中用一个 datetime.date 实例表示。有一些额外的、可选的参数。DateField.auto_now
每次保存对象时,自动将该字段设置为现在。对于“最后修改”的时间戳很有用。
请注意,当前日期 总是 被使用,而不仅仅是一个你可以覆盖的默认值。只有在调用 Model.save() 时,该字段才会自动更新。
当以其他方式对其他字段进行更新时,如 QuerySet.update(),该字段不会被更新,
尽管你可以在这样的更新中为该字段指定一个自定义值。DateField.auto_now_add
当第一次创建对象时,自动将该字段设置为现在。对创建时间戳很有用。
请注意,当前日期是 始终 使用的;它不是一个你可以覆盖的默认值。
因此,即使你在创建对象时为该字段设置了一个值,它也会被忽略。
如果你想修改这个字段,可以设置以下内容来代替 auto_now_add=True :对于 DateField: default=date.today ——来自 datetime.date.today()
对于 DateTimeField: default=timezone.now ——来自 django.utils.timezone.now()class Event(models.Model):start_date = models.DateField()

DateTimeField

用途:存储日期和时间。

一个日期和时间,在 Python 中用一个 datetime.datetime 实例表示。与 DateField 一样,使用相同的额外参数。

class LogEntry(models.Model):created_at = models.DateTimeField(auto_now_add=True)

DecimalField

用途:用于存储精确的十进制数,适用于货币等需要精确计算的场景。

class Transaction(models.Model):amount = models.DecimalField(max_digits=10, decimal_places=2)

EmailField

用途:专门设计用于存储电子邮件地址的字段,提供了内置的验证来确保输入符合电子邮件的标准格式。

class UserProfile(models.Model):email = models.EmailField(max_length=254, unique=True)

URLField

用途:用于存储网址(URL),可选地进行格式验证。

class WebLink(models.Model):url = models.URLField(max_length=200)

FileField 和 ImageField

用途:用于存储文件和图像文件,它们都与文件系统交互,并且可以指定上传文件的存储位置。ImageFieldFileField的子类,专为图像处理做了优化,可以进行图像的缩略图生成等操作。

from django.db import modelsclass Document(models.Model):name = models.CharField(max_length=100)file = models.FileField(upload_to='documents/')class Photo(models.Model):title = models.CharField(max_length=100)image = models.ImageField(upload_to='photos/', height_field='height', width_field='width')height = models.IntegerField(null=True)width = models.IntegerField(null=True)

upload_to参数指定了文件上传后保存的相对路径。ImageField还可以通过height_fieldwidth_field关联到模型中的其他字段,用来存储图像的高度和宽度。

DurationField

用途DurationField 是 Django 模型中用于存储时间间隔的数据字段类型。它适合于记录那些不需要具体日期时间上下文,但需要精确到时、分、秒甚至毫秒的时间长度,比如任务耗时、音乐播放时长等。

from django.db import models
from datetime import timedeltaclass Song(models.Model):title = models.CharField(max_length=100)duration = models.DurationField(null=True, blank=True)# 创建一个歌曲实例
song = Song(title="My Favorite Song")
song.duration = timedelta(minutes=3, seconds=45)  # 设置时长为3分45秒
song.save()# 访问和操作时长
print(song.duration.total_seconds())  # 输出总秒数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平安养老险陕西分公司:举办“贺司庆·员工橙心面对面”活动

为践行新价值文化与“三省”推广&#xff0c;平安养老险陕西分公司以集团36周年司庆为契机结合“员工聆听计划”指引要求&#xff0c;举办“贺司庆&#xff0c;员工橙心面对面”活动。 活动邀请西北大学公共管理学院高阳教授为分公司员工带来生动有趣的《压力管理新科学》心理课…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

安卓开发--安卓使用Echatrs绘制折线图

安卓开发--安卓使用Echatrs绘制折线图 前期资料安卓使用Echarts绘制折线图1.1 下载 Echarts 安卓资源1.2 新建assets文件1.3 新建布局文件1.4 在布局文件中布局WebView1.5 在活动文件中调用 最终效果 前期资料 Echarts 官网样式预览: https://echarts.apache.org/examples/zh/…

phonenumbers,一个强大的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - phonenumbers。 Github地址&#xff1a;https://github.com/daviddrysdale/python-phonenumbers 在现代应用程序中&#xff0c;处理和验证电话号码是一项常见的需求。无论…

《欢乐钓鱼大师》辅助:新手钓鱼全新攻略大全!

《欢乐钓鱼大师》是一款充满趣味和挑战的钓鱼游戏。在游戏中&#xff0c;玩家不仅可以体验钓鱼的乐趣&#xff0c;还可以通过不同的钓鱼竿和鱼卡来提升自己的钓鱼技能。为了帮助新手和老玩家更好地体验游戏&#xff0c;本文将为您提供详细的游戏攻略。 1. 游戏目标 在《欢乐钓…

2024年云南特岗教师报名流程,超详细,明天就开始报名哦!

2024年云南特岗教师报名流程&#xff0c;超详细&#xff0c;明天就开始报名哦&#xff01;

【Nginx <三>⭐️⭐️⭐️】Nginx 负载均衡使用

目录 &#x1f44b;前言 &#x1f440;一、 负载均衡概述 &#x1f331;二、项目模拟 2.1 环境准备 2.2 启动多个服务器 2.3 配置 Nginx 2.4 测试配置 &#x1f49e;️三、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;前不久开始学习了 Nginx 的使用&#xff0c;在…

github加速访问及资源一秒代理下载

如果你想加速打开github网页&#xff0c;可以采用以下方法&#xff0c;仅需一个插件。 1.代理加速访问 打开gitee网站&#xff0c;搜索dev-sidecar关键字&#xff0c;然后找到星星最多的项目 可以阅读项目说明&#xff0c;找到感兴趣的内容或是直接下载DevSidecar桌面应用程序…

读书会(感悟)

书友阅读↓ Morii 5阶学习法 1.测试学习法&#xff08;先测试再学习&#xff0c;课前测试&#xff09; 【4问】 标题是什么&#xff1f; 我的观点是什么?主题是什么? 想解决的问题是什么? 【看前言➕结尾——初步看本书的逻辑?好书?】 2.指读法~细节【逻辑】 手指指着文字…

SAP-技巧篇实现GUI免密码登录

做为上千万的软件怎么会没有免密码登录呢 01 — 背景需求 如何实现SAP GUI免密码登录&#xff0c;不输入密码实现系统自动登录。 免责声明&#xff1a;谨慎设置&#xff0c;因免密登录导致数据泄密&#xff0c;作者概不负责。 02 — 实现 客户端要求&#xff1a;SAP G…

C++|动手实现strcpy、memcpy、memmove

strcpy 手写一个字符串拷贝函数: char* my_strcpy(char* dest, const char* src) {char* dest_ptr dest;while (*src ! \0) *dest_ptr *src;*dest_ptr \0;return dest; }确定好函数原型&#xff0c;函数返回目标字符串 dest 的地址&#xff0c;复制原字符串const char *sr…

069.餐饮案例:背广告词吃饭免单 餐厅年入百万

069.餐饮案例&#xff1a;背广告词吃饭免单 餐厅年入百万 时间: 2024-5-26 分类: 营销流量 作者: admin 0 次浏览 069.餐饮案例&#xff1a;背广告词吃饭免单 餐厅年入百万 背广告词吃饭免单 小餐馆巧计提人气 2007 年&#xff0c;如同许多创业者一样&#xff0c;郑州女孩韩月遭…

2024年5月LLM最新排名:GPT-4o出道即巅峰!国内3个大模型榜上有名!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

上位机图像处理和嵌入式模块部署(f103 mcu的最小软件系统)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道mcu电路有最小系统。一个最小硬件系统里面包含了mcu、晶振、复位、输入和输出。其实不光硬件如此&#xff0c;软件也有一个最小系统。而…

颜色值进制转换

颜色值进制转换 专业的和非专业程序员在编程时都碰到过颜色值的表达式。特别是在编制网页和设计界面时&#xff0c;都要选择颜色。各语言的颜色值表达式就两种&#xff0c;十六进制的颜色值hex$和十进制的RGB格式。现成的调色板颜色表也是这两种格式。写代码时会遇到写颜色值码…

打造有情感的AI智能体-情感问答

目录 文心智能体平台简介 情感问答智能体介绍 优势1主动提问深入分析你的困扰&#xff0c;合理建议 优势2多次主动提问&#xff0c;引导用户补全信息。 优势3整合多种强大工具 最近发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c…

04.爬虫---Session和Cookie

04.Session和Cookie 1.Session2.Cookie3.详细对比4.Cookie属性结构5.一些误区 Session和Cookie是Web开发中用于用户状态管理的两种常见技术。理解它们的区别对于开发安全的Web应用至关重要。 1.Session Session代表服务器与客户端的一次会话过程。服务器端存储了Session对象&…

重生奇迹MU格斗家上手最轻松的职业

重生奇迹MU格斗家玩法攻略&#xff0c;有一个比较奇葩的职业&#xff0c;那就是格斗家。格斗家拥有其他职业没有的优势&#xff0c;就是加体力和敏捷都可以提升攻击力百分比。格斗家玩法攻略 目前格斗家最多的就是敏格玩法&#xff0c;配合智力MM加成后的幽冥光速拳可以说是第…

中国电子学会(CEIT)2023年09月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试四级 2023年09月 编程题四道 总分:100分一、酒鬼(25分) Santo刚刚与房东打赌赢得了一间在New Clondike的大客厅。今天,他来到这个大客厅欣赏他的奖品。 房东摆出了一行瓶子在酒吧上。瓶子…