Django model中choice的使用总结
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.IntegerChoices
和 models.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的使用总结相关推荐
- Django动态获取mysql连接,django model中的choices 动态从数据库中获取
django model中的choices 动态从数据库中获取 例如 model中,有一个type字段 type = models.CharField(max_length=255, default= ...
- django model中的DateField()转为时间戳
现在需要把django项目中一个model的DateField()字段转变为时间戳的形式,直接上代码: import time import datetime#这行根据查询规则得到 DateField ...
- django model中的meta类
中文转自http://blog.csdn.net/yelbosh/article/details/7545335 英文django文档:https://docs.djangoproject.com/e ...
- Django model 中的 class Meta 详解
通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: 1 2 3 4 5 class Foo(models.Model): bar = ...
- django model中的save()方法--model的主键pk
Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None) 一.主键, ...
- Django model中的 class Meta 详解
参考 (1) https://www.cnblogs.com/tongchengbin/p/7670927.html
- python怎么设置字段_Django Model中字段(field)的各种选项说明
字段与选项 CharField() 字符字段 max_length = xxx or None # 必选项 blank = True 和 default = '' # 如果不是必填项,可以设置 uni ...
- 在django restful framework中设置django model的property
众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...
- Django的model中日期字段设置默认值的问题
之前写过这样一个model: class MonthlyFeeMember(models.Model):worker = models.ForeignKey(Student, verbose_name ...
最新文章
- GlusterFS配置管理(五)
- Hybris service layer和SAP CRM WebClient UI架构的横向比较
- webug3.0下载环境搭建使用
- 设置 Xcode 自动生成代码片段
- php 判断苹果还是安卓,PHP简单判断iPhone、iPad、Android及PC设备的方法
- 电子计算机工程学,电子计算机工程学荣誉工学士资料.ppt
- linux pandas教程_这7种Python的全新玩法,你们一定不知道!(附赠Python教程)
- Python 面向对象 —— __init_ 与 __new__
- CodeForces round 753 problem A Linear Keyboard(线性键盘)
- NoteBurner Spotify Music Converter mac - 音乐转换器
- php directory lister,PHP目录展示工具DirectoryLister
- asp mysql 留言本_手把手教你设计ASP+ACCESS留言本
- 自我鉴定200字大专生计算机专业,大专毕业生自我鉴定200字
- 看共享单车上的智能车锁有何区别
- 拿下多家主机厂数百万前装定点,禾赛科技激光雷达量产进程加速
- 错误请联系管理员文件 index.php,GS登录报错,提示【访问权限失败,请联系管理员处理】...
- 为什么拉格朗日对偶函数一定是凹函数(逐点下确界)
- android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
- wordpress博客构建
- linux vim go语言,CentOS7系统基于Vim8搭建Go语言开发环境
热门文章
- 日期时间格式转换为date
- cached in the local repository, resolution will not be reattempted until the update interval of RIIL
- 看了一下bootstrap css
- JAVA中什么是JavaSE和JavaEE?
- 以色列突然宣布:颠覆了人类的思维
- 全球主流智能手环传感器模块拆解大揭秘
- 人脸识别之人脸对齐(八)--LBF算法
- 【icyle】组会论文分享编写:从Markdown到Latex
- html5 手游制作,HTML5游戏制作(九)——炮塔游戏
- 英特尔携手行业合作伙伴加速中国5G部署