define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

86c23a8d76be9ef3ccd94959ec34371e.png

Django 3.0的主要新增功能之一是对模型字段选择的枚举。它是一种定义和约束模型Field.choices的更好方法。

3d9c70f02108188c9c32f56171af3cfc.png

以前在Django模型中通常会通过定义一些“常量”和元组来定义choices,如下所示:

from django.db import modelsclass Book(models.Model):UNPUBLISHED = 'UN'PUBLISHED = 'PB'STATUS_CHOICES = [(UNPUBLISHED, 'Unpublished'),(PUBLISHED, 'Published'),]status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=UNPUBLISHED,)

然后其他人可以按如下方式使用这些常量,例如:

unpublished_books = Book.objects.filter(status=Book.UNPUBLISHED)

如果多个模型使用同一组选项choices和常量,则可能需要把choices选项和常量从模型级别而转到模块级别,此时再也不能在通过Book.UNPUBLISHED的获取常量内容了。

from django.db import modelsUNPUBLISHED = 'UN'
PUBLISHED = 'PB'
STATUS_CHOICES = [(UNPUBLISHED, 'Unpublished'),(PUBLISHED, 'Published'),
]class Book(models.Model):status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=UNPUBLISHED,)class Pamphlet(models.Model):status = models.CharField(max_length=2,choices=STATUS_CHOICES,default=PUBLISHED,)

这样在models.py文件中留下一堆没有命名空间的常量, 这有点违反《 Python之禅》:

命名空间是一个很棒的主意–让我们做更多的事!

这也使我们缺少一些有用的功能。例如,没有简单的方法可以将值转换为其显示标签。

更新(2020年1月28日): 老版模型实例Django了提供get_FOO_display()方法来转换值choice选项值对应的标签。

存在诸如django-choices和django-enumfields之类的软件包来解决这些问题。我还看到了其他项目上几个类似功能的自定义实现。

Django 3.0现在提供了一个Choices带有两个子类类IntegerChoicesTextChoices。这些类扩展了Python的Enum类型,并增加了额外的约束和功能,以使其适用于Field.choices

现在我们要转换之前的示例,我们定义一个新的Status类,该类继承了TextChoices类,用于替换我们之前定义的STATUS_CHOICES元组。现在Status.choices与STATUS_CHOICES是等同的。除此以外,你还可以使用Status.UNPUBLISHED的方式调用Status类下的常量。此时常量UNPUBLISHED有了自己的命名空间,更安全,也使代码可读性更高。

class Status(models.TextChoices):UNPUBLISHED = 'UN', 'Unpublished'PUBLISHED = 'PB', 'Published'class Book(models.Model):status = models.CharField(max_length=2,choices=Status.choices,default=Status.UNPUBLISHED,)class Pamphlet(models.Model):status = models.CharField(max_length=2,choices=Status.choices,default=Status.PUBLISHED,)

我们可以通过检查未检测到迁移变化来测试是否正确转换:

$python manage.py makemigrations --dry-run
No changes detected

如果我们添加,删除或重新排序了任何成员,则这将被检测为字段中的更改。这是因为迁移框架仅看到由choices生成的列表Status.choices,而看不到枚举类。

QuerySet过滤器可以更新为使用以下Choices类:

unpublished_books = Book.objects.filter(status=Status.UNPUBLISHED)

我们还可以轻松地将值转换为其显示标签:

In [2]: book = Book.objects.latest('id')In [3]: Status(book.status)
Out[3]: <Status.UNPUBLISHED: 'UN'>In [4]: Status(book.status).label
Out[4]: 'Unpublished'

更干净!

结语

我希望这可以帮助您享受这一新的Django 3.0功能。该枚举类型的文件涵盖了一些细节,值得一读。感谢Shai Berger,Nick Pope,Marius Felisiak,Carlton Gibson,以及所有其他负责添加它的人(票号#27910)。

-亚当

原文链接:https://adamj.eu/tech/2020/01/27/moving-to-django-3-field-choices-enumeration-types/

相关阅读

支持异步的Django 3.X来了,你准备好了吗? Django 3.0新特色与变化详解。

bf1e3ee6999db0836e5e6b37cc568a5d.png

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

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

相关文章

linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】

1、rpm和yum1.1、介绍rpm: rpm 是由 Red Hat 公司开发的一种软件包管理方式&#xff0c;使用 rpm 我们可以方便的进行软件的安装、查询、卸载等工作&#xff0c;但是使用 rpm 命令安装 rpm 软件包&#xff0c;不能自己解决软件包之间的依赖性问题&#xff0c;需要自己一个一个去…

mysql 为数据表添加字段_MySQL数据表添加字段实例

MySQL 允许在开头、中间和结尾处添加字段。针对不同的位置&#xff0c;MySQL数据表添加字段的方式也有所不同&#xff0c;下面我们一起来看MySQL数据表添加字段的实例&#xff0c;方便我们理解MySQL数据表添加字段的方式。MySQL数据表添加字段分为开头、 中间和末尾三种情况&am…

postgresql 客户端_一款功能强大的数据库客户端:DataGrip

前言在我们日常的程序开发中&#xff0c;很大一部分时间是在与数据库打交道。查数据&#xff0c;导数据&#xff0c;检查SQL执行计划&#xff0c;优化SQL等&#xff0c;是我们数据库开发工作的重要组成部分&#xff0c;而且很多时候我们会使用到多款数据库&#xff0c;如Oracle…

mysql主从同步报错_mysql主从同步报错

主从不同步&#xff0c;经查看发现如下报错Last_Errno: 1666​Last_Error: Error executing row event: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT STATEMENT.问题原因&#xff1a;主从复制&#xff…

java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?

存在的问题自旋锁自适应自旋Java 对象的内存布局(重要)synchronized 锁升级流程偏向锁轻量级锁重量级锁可重入悲观锁(互斥锁、排他锁)《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解…

python定义test方法_向python/django失败的测试方法的详细信息中添加自定义/调试消息的任何方法unittest.TestCase?...

通常&#xff0c;您希望从django的unittest类TestCase继承&#xff0c;可以从django.测试. 也就是说&#xff0c;您可以将msg参数传递给您要评估的任何内容&#xff0c;其中包含失败消息。在以下是“人性化”的一个例子&#xff1a;class HumanizeTests(TestCase):def humanize…

mysql 创建新用户权限_MySQL创建新用户以及权限授予

1.通过mysql数据库的user表查看用户相关信息mysql> use mysql;mysql> select host,user from user;查看用户相关信息2.创建数据库mysql> create database [databasename] default character set utf8 collate utf8_general_ci;3.创建新用户mysql> create user user…

中秋祝福网页_中秋客户维系关怀,该送客户什么礼品?

企业节日礼品是企业间或者商务伙伴之间相互传达美好情意的一种体现&#xff0c;无论是送领导、送员工、还是送合作伙伴&#xff0c;礼品定制都需要根据不同赠送对象来细心选择。如果想要礼品有创意同时又能表达企业理念&#xff0c;进而达到宣传推广或者品牌认知提升的效果&…

ubuntu php mysql5.6_Ubuntu16.04搭建php5.6Web服务器环境

Ubuntu 16.04默认安装php7.0环境&#xff0c;但是php7目前对某些旧系统的兼容性并不是很好&#xff0c;如果自行安装php5需要清除php7的已安装包&#xff0c;否则会报错。移除默认及已安装的PHP包sudo dpkg -l | grep php| awk {print $2} |tr "\n" " "sud…

浏览器svg插件_Archer-svgs: 异步加载svg方案

Github地址&#xff1a; ShanaMaid/archer-svgs哇哦!无限的svgs!你可以使用archer-svgs去异步加载svg并将它缓存在localStorage里&#xff0c;当你再次使用已经加载过的svg时将不需要再发起http请求。将svgs从你的js-bunlde里移除&#xff0c;并且永远减小js-bunlde的体积。&am…

php打开网页执行即执行bat程序_CVE202011107:XAMPP任意命令执行漏洞复现

0x00简介XAMPP是一个把Apache网页服务器与PHP、Perl及MariaDB集合在一起的安裝包&#xff0c;允许用戶可以在自己的电脑上轻易的建立网页服务器。该软件与phpstudy类似。2020年4月1日ApacheFriends官方发布了XAMPP新版本&#xff0c;该更新解决了Windows Platforms CVE-2020-11…

阿里云rocketmq_云原生时代消息中间件的演进路线

作者 | 周礼&#xff08;不铭&#xff09; 阿里巴巴集团消息中间件架构师导读&#xff1a;本文整理自作者于 2020 年云原生微服务大会上的分享《云原生时代的消息中间件演进》&#xff0c;主要探讨了传统的消息中间件如何持续进化为云原生的消息服务。关注阿里巴巴云原生公众号…

mongodb mysql配置_Nosql_MongoDB数据库配置以及基本指令

数据库(database)-数据库的服务器-服务器用来保存数据-mongod用来启动服务器-数据库的客户端-客户端用来操作服务器&#xff0c;对数据进行增删改查的操作-mongo用来启动客户端(不能关闭启动的服务器&#xff0c;否则新开的客户端无法连接)扩展&#xff1a;将mongodb设置为系统…

python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...

今天看到几个关于pygame模块的博客和视频&#xff0c;感觉非常有趣&#xff0c;这里照猫画虎写了一个贪吃蛇小游戏&#xff0c;目前还有待完善&#xff0c;但是基本游戏功能已经实现&#xff0c;下面是代码&#xff1a;# 导入模块import pygameimport random# 初始化pygame.ini…

mysql爱吃鱼油_鱼油or磷虾油,多油饮食的国人心血管健康如何拯救?

作为美食大国&#xff0c;高油重口的饮食生活习惯直接导致我国心血管病患病率处于逐年上升的阶段&#xff0c;据统计我国现有心血管病患者已达3.3亿人&#xff0c;占总人口的40%以上。许多年轻人心血管健康已经呈现过度损害状况&#xff0c;心血管疾病也不再是中老年专利。因此…

python如何实现选项功能_python几种常用功能如何实现 python几种常用功能实现代码实例...

本篇文章小编给大家分享一下python几种常用功能实现代码实例&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。1、python 程序退出的几种方式import syssys.exit()sys.exit(0)sys.exit(1)或者os._exit()该方法中包含…

小程序promise封装post请求_Promise封装微信小程序的Request请求

回调地狱一向是影响开发和维护的症结所在&#xff0c;无数个success()的嵌套再嵌套&#xff0c;导致代码层级颇深&#xff0c;盘一次逻辑都要费劲千辛万苦&#xff0c;ES6语法中的Promise&#xff0c;便是专为解决JS中异步请求回调的信任问题而存在的&#xff0c;结合小程序目前…

kafka学习_Kafka 学习笔记01

Kafka概念和基本架构概述以下内容来自拉勾课程学习拉勾教育 - 拉勾旗下教育平台一、Kafka介绍Kafka是最初由 Linkedin 公司开发&#xff0c;是一个 分布式、分区的、多副本的、多生产者、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&a…

mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录

我有两张桌子EMPGROUP_TBLSEQID | MASTERID | BUSINESS_UNIT | DIVISION | SUB_DIVISION | CLASSIFICATION | SUB_CLASSIFICATION和EMP_MASTERTBLMASTERID | EMPNO | LASTNAME | FIRSTNAME | JOBTITLE | LOCATION |在我的ASP.NET JOBTITLE表中,BUSINESS_UNIT,DIVISION,SUB_DIVI…

python小车行驶路线图_基于python的小车走黑线

【实例简介】一个简单的基于python的小车走黑线项目&#xff0c;结合了OpenCV【实例截图】【核心代码】工科创II-B└── 工科创II-B├── guaidian.jpg├── 草稿│ ├── TT.PY│ ├── huatu.py│ ├── img.png│ └── ss.py├── 编译.py├── 最终版│ …