Django model choice

Django model中的choice使用核心是利用二元组 , 二元组的第一个元素实际model存储的值,第二个元素是用户友好阅读的值

常规用法

单独定义一个二元组

LANGUAGE_V1 = [('cn', 'Chinese'),('en', 'English'),('fr', 'French'),
]

然后在Django model中使用

from django.db import modelsclass Book(models.Model):name = models.CharField(max_length=128)language = models.CharField(max_length=2, choices=LANGUAGE_V1)def __str__(self):return self.name

作为Model类型的常量

class Book(models.Model):CHINESE = 'cn'ENGLISH = 'en'FRENCH = 'fr'LANGUAGE_V2 = ((CHINESE, 'Chinese'),(ENGLISH, 'English'),(FRENCH, 'French'))name = models.CharField(max_length=128)language = models.CharField(max_length=2, choices=LANGUAGE_V2, default=CHINESE)def __str__(self):return self.name

官方建议的枚举类型

class Book(models.Model):class LanguageV3(models.TextChoices):CHINESE = 'cn', 'Chinese'ENGLISH = 'en', 'English'FRENCH = 'fr',  'French'name = models.CharField(max_length=128)# 注意这里的choices值的用法 LanguageV3.choiceslanguage = models.CharField(max_length=2, choices=LanguageV3.choices, default=LanguageV3.CHINESE)def __str__(self):return self.name

除了 TextChoices, 还有 models.IntegerChoicesmodels.Choices

Python的Enum类实现

from enum import Enum, EnumMetaclass LangaugeEnum(Enum):ch = 'Chinese'en = 'English'fr = 'French'class Book(models.Model):name = models.CharField(max_length=128)# 注意这里的choices值的用法, 使用了 列表表达式# 和 default的赋值 LangaugeEnum.cn.namelanguage = models.CharField(max_length=2, choices=[(tag.name, tag.value for tag in LangaugeEnum)], default=LangaugeEnum.ch.name)def __str__(self):return self.name

其实Python的Enum类实现更推荐如下方法

class ChoiceEnumMeta(EnumMeta):def __iter__(self):return ( (tag.name, tag.value) for tag in super().__iter__())class ChoiceEnum(Enum, metaclass=ChoiceEnumMeta):passclass LangaugeEnum(ChoiceEnum):ch = 'Chinese'en = 'English'fr = 'French'class Book(models.Model):name = models.CharField(max_length=128)# 注意这里的choices值的用法: LangaugeEnum# 和 default的赋值 LangaugeEnum.cn.namelanguage = models.CharField(max_length=2, choices=LangaugeEnum, default=LangaugeEnum.ch.name)def __str__(self):return self.name

不同的方式最终入库的结果和admin后台的用法是一样的

sqlite> select * from app_book ;
1|Python Book Examples|ch
sqlite> select * from app_bookv2;
1|资治通鉴|ch
sqlite> .schema app_book
CREATE TABLE IF NOT EXISTS "app_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(128) NOT NULL, "language" varchar(2) NOT NULL);
sqlite> .schema app_bookv2
CREATE TABLE IF NOT EXISTS "app_bookv2" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(128) NOT NULL, "language" varchar(2) NOT NULL);
sqlite>

admin 后台使用

参考

关于django model fields中的choice用法

Enumeration types

Django model中choice的使用总结相关推荐

  1. Django动态获取mysql连接,django model中的choices 动态从数据库中获取

    django model中的choices 动态从数据库中获取 例如 model中,有一个type字段 type = models.CharField(max_length=255, default= ...

  2. django model中的DateField()转为时间戳

    现在需要把django项目中一个model的DateField()字段转变为时间戳的形式,直接上代码: import time import datetime#这行根据查询规则得到 DateField ...

  3. django model中的meta类

    中文转自http://blog.csdn.net/yelbosh/article/details/7545335 英文django文档:https://docs.djangoproject.com/e ...

  4. Django model 中的 class Meta 详解

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: 1 2 3 4 5 class Foo(models.Model):     bar = ...

  5. django model中的save()方法--model的主键pk

    Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None) 一.主键, ...

  6. Django model中的 class Meta 详解

    参考 (1) https://www.cnblogs.com/tongchengbin/p/7670927.html

  7. python怎么设置字段_Django Model中字段(field)的各种选项说明

    字段与选项 CharField() 字符字段 max_length = xxx or None # 必选项 blank = True 和 default = '' # 如果不是必填项,可以设置 uni ...

  8. 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...

  9. Django的model中日期字段设置默认值的问题

    之前写过这样一个model: class MonthlyFeeMember(models.Model):worker = models.ForeignKey(Student, verbose_name ...

最新文章

  1. GlusterFS配置管理(五)
  2. Hybris service layer和SAP CRM WebClient UI架构的横向比较
  3. webug3.0下载环境搭建使用
  4. 设置 Xcode 自动生成代码片段
  5. php 判断苹果还是安卓,PHP简单判断iPhone、iPad、Android及PC设备的方法
  6. 电子计算机工程学,电子计算机工程学荣誉工学士资料.ppt
  7. linux pandas教程_这7种Python的全新玩法,你们一定不知道!(附赠Python教程)
  8. Python 面向对象 —— __init_ 与 __new__
  9. CodeForces round 753 problem A Linear Keyboard(线性键盘)
  10. NoteBurner Spotify Music Converter mac - 音乐转换器
  11. php directory lister,PHP目录展示工具DirectoryLister
  12. asp mysql 留言本_手把手教你设计ASP+ACCESS留言本
  13. 自我鉴定200字大专生计算机专业,大专毕业生自我鉴定200字
  14. 看共享单车上的智能车锁有何区别
  15. 拿下多家主机厂数百万前装定点,禾赛科技激光雷达量产进程加速
  16. 错误请联系管理员文件 index.php,GS登录报错,提示【访问权限失败,请联系管理员处理】...
  17. 为什么拉格朗日对偶函数一定是凹函数(逐点下确界)
  18. android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
  19. wordpress博客构建
  20. linux vim go语言,CentOS7系统基于Vim8搭建Go语言开发环境

热门文章

  1. 日期时间格式转换为date
  2. cached in the local repository, resolution will not be reattempted until the update interval of RIIL
  3. 看了一下bootstrap css
  4. JAVA中什么是JavaSE和JavaEE?
  5. 以色列突然宣布:颠覆了人类的思维
  6. 全球主流智能手环传感器模块拆解大揭秘
  7. 人脸识别之人脸对齐(八)--LBF算法
  8. 【icyle】组会论文分享编写:从Markdown到Latex
  9. html5 手游制作,HTML5游戏制作(九)——炮塔游戏
  10. 英特尔携手行业合作伙伴加速中国5G部署