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;需要自己一个一个去…

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 实现原理与源码解…

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;进而达到宣传推广或者品牌认知提升的效果&…

浏览器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设置为系统…

kafka学习_Kafka 学习笔记01

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

php 随机在文章中添加锚文本_锚文本对网站SEO优化有什么帮助?

对于优化人员来说&#xff0c;网站在做优化时都会在网站关键词或长尾词上添加锚文本&#xff0c;锚文本又称锚文本链接&#xff0c;是链接的一种形式。那么描文本的添加对网站优化都有什么好处呢&#xff1f;下面一起来了解一下。一、锚文本为网站传递权重在更新网站内容时&…

malloc 结构体_二进制安全之堆溢出(系列)——堆基础 amp; 结构(二)

哈喽啊这里是二进制安全之堆溢出&#xff08;系列&#xff09;第二期“堆基础 & 结构”第二节&#xff01;&#xff01;话不多说&#xff0c;直接上干货&#xff01;微观结构函数执行流程void *malloc (size_t bytes) void *__libc_malloc (size_t bytes) //对于_int_mallo…

深入理解计算机系统第四版_深入理解计算机系统之存储器层次结构

我的计算机模型是这样的&#xff1a;CPU执行指令&#xff0c;内存犹如一个巨大的字节数组&#xff0c;存储着指令和数据&#xff0c;硬盘保存着各种程序与程序用到的数据。I/O完成输入输出的功能。在本文中我们抛开I/O&#xff0c;谈一谈关于CPU&#xff0c;内存&#xff0c;硬…

java jmeter_使用Jmeter中的Java Request进行性能测试

在使用jmeter进行性能测试的时候&#xff0c;有可能会需要通过一些脚本去测试性能&#xff0c;(比如通过sokeeper的api去测试sokeeper的读写性能)。这时&#xff0c;我们可以通过Java Request实现&#xff0c;以下是操作步骤。首先创建一个maven project。因Jmeter的Java Reque…

m.2接口和nvme区别_m.2 nvme和m.2有区别吗?

m2接口有两种&#xff0c;一种走sata的&#xff0c;另外一种走pcie(就是nvme)的。走sata的速度跟传统sata接口的没区别&#xff0c;就是接口变成了m2的了。走pcie的&#xff0c;就是我们说的nvme接口是m2的&#xff0c;性能也强了。M.2接口有SATA也有NVMe PCIe协议。这个是同一…

如何查看cplex的help文档_word查看技巧:如何快速找到文档的修改痕迹

不知道大家在工作中有没有遇到过这类的工作场景&#xff1a;当初步拟好一份合作协议或是项目策划书后&#xff0c;发给老板或其他同事审阅和修订&#xff0c;通常会不断地来回修改文档。此时&#xff0c;如果你想要查看文档哪里被修改过&#xff1f;你会怎么操作&#xff1f;很…

mysql set语句_MySQL Prepared语句简介

之前的MySQL版本4.1&#xff0c;查询以文本格式发送到MySQL服务器。 之后&#xff0c;MySQL服务器使用文本协议将数据返回给客户端。MySQL必须完全解析查询&#xff0c;并将结果集转换为字符串&#xff0c;然后再将其返回给客户端。 文本协议具有严重的性能问题。为了解决这个问…

三同轴连接器_一种毫米波频段微带同轴转换结构

在微波电路中&#xff0c;同轴电缆和微带线是微波系统中常见的两种微波传输线&#xff0c;同轴电缆以其频带宽、屏蔽性好、结构简单、可弯曲等特性&#xff0c;常被用作模块或系统之间连接的传输线。在高频段&#xff0c;微带线是混合微波集成电路(Hybrid Microwave Integrated…

nginx https透明代理_Nginx反向代理https,配置lets-encrypt证书教程

前言本站也终于迁移到https了&#xff0c;由于全Docker部署&#xff0c;迁移过程中真是艰难无比&#xff08;wordpress那块被折腾的想放弃了&#xff09;,也欢迎访问本人博客&#xff0c;&#xff08;知乎的排版有些乱&#xff09;Nginx反向代理https&#xff0c;配置lets-encr…