关于Django 模型字段 `choices`自定义数据类型的枚举——补充

文章目录

    • 1. 处理 `datetime` 类型的 `choices`
    • 2. 处理 `time` 类型的 `choices`
    • 3. 处理 `Decimal` 类型的 `choices`
    • 4. 处理 `UUID` 类型的 `choices`
    • 5. 处理 `float` 类型的 `choices`

Choices 类的基础上扩展,可以将 choices 与特定数据类型(如 datedatetime)结合,适合需要特定类型支持的场景,如日期 date

import datetimeclass MoonLandings(datetime.date, models.Choices):APOLLO_11 = 1969, 7, 20, "Apollo 11 (Eagle)"APOLLO_12 = 1969, 11, 19, "Apollo 12 (Intrepid)"

类似的方式还可以应用于处理其他特定数据类型,例如 datetimetimeDecimalUUID 等。以下是一些常见数据类型的示例:

1. 处理 datetime 类型的 choices

假设我们需要记录一些重要的时间点,可以使用 datetime.datetimemodels.Choices 来定义这些选择:

import datetime
from django.db import modelsclass ImportantMoments(datetime.datetime, models.Choices):NEW_YEAR = 2024, 1, 1, 0, 0, 0, "New Year 2024"SUMMER_SOLSTICE = 2024, 6, 21, 12, 0, 0, "Summer Solstice 2024"WINTER_SOLSTICE = 2024, 12, 21, 12, 0, 0, "Winter Solstice 2024"class Event(models.Model):moment = models.DateTimeField(choices=ImportantMoments.choices)

这里的 moment 字段的可选项是特定的 datetime 值,比如“2024 年的新年”等。这样我们可以确保用户只能选择预定义的时间点。

2. 处理 time 类型的 choices

如果需要记录某些特定的时间(比如营业时间、特殊的时刻),可以用 datetime.timemodels.Choices

import datetime
from django.db import modelsclass BusinessHours(datetime.time, models.Choices):OPENING = 9, 0, 0, "Opening Time"CLOSING = 18, 0, 0, "Closing Time"LUNCH_BREAK = 12, 0, 0, "Lunch Break"class Store(models.Model):operation_time = models.TimeField(choices=BusinessHours.choices)

在这个例子中,operation_time 字段的可选值只能是 BusinessHours 定义的几个特定时刻,比如开门时间、关门时间和午休时间。

3. 处理 Decimal 类型的 choices

有时我们需要记录固定的金额,可以用 Decimalmodels.Choices。例如,对于定价的选择,可以使用 Decimal 来精确表示金额。

from decimal import Decimal
from django.db import modelsclass FixedPrices(Decimal, models.Choices):BUDGET = Decimal("9.99"), "Budget Option"STANDARD = Decimal("19.99"), "Standard Option"PREMIUM = Decimal("29.99"), "Premium Option"class Product(models.Model):price = models.DecimalField(max_digits=5, decimal_places=2, choices=FixedPrices.choices)

在这里,price 字段的选项是特定的价格,比如“预算选项”、“标准选项”等,可以确保用户只能选择固定的金额。

4. 处理 UUID 类型的 choices

如果使用 UUID 来标识某些特定的设备或版本,我们可以用 uuid.UUIDmodels.Choices。例如,在记录设备时,指定唯一的 UUID 作为选项:

import uuid
from django.db import modelsclass KnownDevices(uuid.UUID, models.Choices):DEVICE_A = uuid.UUID("123e4567-e89b-12d3-a456-426614174000"), "Device A"DEVICE_B = uuid.UUID("123e4567-e89b-12d3-a456-426614174001"), "Device B"DEVICE_C = uuid.UUID("123e4567-e89b-12d3-a456-426614174002"), "Device C"class Device(models.Model):device_id = models.UUIDField(choices=KnownDevices.choices)

这样可以确保 device_id 字段只能是已知设备的 UUID

5. 处理 float 类型的 choices

在某些情况下,如果我们需要用浮点数记录物理常量(比如π值的不同精度),可以使用 float 类型。

from django.db import modelsclass PiValues(float, models.Choices):LOW_PRECISION = 3.14, "Low Precision Pi"MEDIUM_PRECISION = 3.14159, "Medium Precision Pi"HIGH_PRECISION = 3.1415926535, "High Precision Pi"class Measurement(models.Model):pi_value = models.FloatField(choices=PiValues.choices)

通过这种方法,pi_value 字段仅限于选择特定精度的 π 值。

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

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

相关文章

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决

我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …

如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?

确保你的 Ubuntu 24.04 服务器的安全是至关重要的,特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试,特别是通过 SSH。Fail2ban 是一个强大的工具,可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中,我…

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展,多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求,尤其是中英双语用户的需求,设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…

关于 3D Engine Design for Virtual Globes(三维数字地球引擎设计)

《3D Engine Design for Virtual Globes》是一本专注于三维虚拟地球引擎设计的专业书籍。这本书由Patrick Cozzi和Kevin Ring编写,覆盖了设计适用于虚拟球面环境的三维引擎的各个方面。虚拟地球引擎作为地理信息系统(GIS)中的一个核心组件&am…

单元测试、集成测试、系统测试有什么区别

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中,单元测试粒度最小,系统du测试粒度最大。 2、测试方式不同…

CE2.【C++ Cont】练习题组2

1.数字反转 https://www.luogu.com.cn/problem/P5705 题目描述 输入一个不小于 100100 且小于 10001000,同时包括小数点后一位的一个浮点数,例如 123.4123.4 ,要求把这个数字翻转过来,变成 4.3214.321 并输出。 输入格式 一行一个…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

适合二开的web组态?

一、web组态的定义和背景 在深入探讨之前&#xff0c;我们先回顾一下“组态”的定义。在工业自动化领域&#xff0c;组态软件是用于创建监控和数据采集&#xff08;SCADA&#xff09;系统的工具&#xff0c;它允许工程师构建图形界面&#xff0c;实现与各种设备和机器的数据交互…

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件&#xff0c;这个文件中会存在hbase中的数据以kv类型显示&#xff0c;同时还会存在hbase的元数据信息&#xff0c;包括整个hfile文件的索引大小&…

MySQL 忘记 root 密码,使用跳过密码验证进行登录

MySQL 忘记 root 密码&#xff0c;使用跳过密码验证进行登录 修改 /etc/my.cnf 配置文件&#xff0c;在 [mysqld] 后面任意一行添加 skip-grant-tables vim /etc/my.cnf 重启 MySQL systemctl restart mysqld 登录 MySQL&#xff08;无 -p 选项&#xff0c;无需密码登录&…

[Linux]IO多路转接(上)

1. IO 多路转接之select 1.1 select概述 select 是系统提供的一个多路转接接口&#xff0c;其核心工作在于等待。它能够让程序同时监视多个文件描述符上的事件是否就绪&#xff0c;只有当被监视的多个文件描述符中有一个或多个事件就绪时&#xff0c;select 才会成功返回&…

推荐一款电脑清理和加速工具:Wise Care 365 Pro

Wise Care 365 Pro是一款可以清理注册表和磁盘垃圾文件&#xff0c;保护个人隐私记录&#xff0c;提高电脑使用安全的软件&#xff0c;是优化系统、提高Windows系统运行速度最好的选择!实时保护注册表不被其他程序未经许可地秘密修改。例如阻止程序更改您的浏览器主页&#xff…

Hook小程序

下载&#xff1a; https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 配置&#xff1a; pip install -r requirements 实现&#xff1a; 开启小程序开发者模式&#xff0c;类似浏览器F12 效果&#xff1a; 使用&#xff1a; 退出微信&#xff0c;进入安装的目录…

Mysql 8迁移到达梦DM8遇到的报错

在实战迁移时&#xff0c;遇到两个报错。 一、列[tag]长度超出定义 在mysql中&#xff0c;tag字段的长度是varchar(20)&#xff0c;在迁移到DM8后&#xff0c;这个长度不够用了。怎么解决&#xff1f; 在迁移过程中&#xff0c;“指定对象”时&#xff0c;选择转换。 在“列映…

PyQt5 在线环境搭建

1.记得升级pip&#xff0c;升级后就会一路畅通的安装&#xff0c;无论是在终端通过命令安装&#xff0c;还是在pycharm中&#xff0c;通过设置&#xff0c; python -m pip install --upgrade pip 升级后安装pyqt5,pyqt5-tools,pyqt5-stubs。 命令安装 pycharm->设置&…

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平 导航适用性强&#xff0c;几乎所有类型的网站都可以使用&#xff0c;设计难度较低。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在…

将数据上传至hdfs的两种方式:java代码上传、将数据放入kafka中,通过flume抽取

目录 1、 生成一条&#xff0c;使用 java 代码将数据放入hdfs上传。 2、 生成一条&#xff0c;编写kafka生产者&#xff0c;将数据放入kafka。kafka source-->flume -->hdfs sink 场景题&#xff1a; 使用 java 代码随机生成学生信息&#xff0c;学生的学号从 0001 开…

【vue】echarts地图添加蒙版图片,多图层地图实现天气信息展示

实现原理&#xff1a;多层图层叠加实现复杂的信息展示。 <template><div class"wrapper"><el-drawertitle"天气信息":modal"iszz":visible.sync"weatherinfo":direction"direction"><drawer:labelnam…

100+SCI科研绘图系列教程(R和python)

科研绘图系列&#xff1a;箱线图加百分比点图展示组间差异-CSDN博客科研绘图系列&#xff1a;箱线图加蜜蜂图展示组间数据分布-CSDN博客科研绘图系列&#xff1a;小提琴图和双侧小提琴图展示组间差异-CSDN博客科研绘图系列&#xff1a;组间差异的STAMP图的ggplot2实现-CSDN博客…

QT鼠标事件

QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目&#xff0c;在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件&#xff0c;选择 C Class 自定义类名Mylabel&#xff0c;选择基类Base …