Django model中choice的使用总结

2022-08-25 Django 0 489

Django model choice

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

常规用法

单独定义一个二元组

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

然后在Django model中使用

from django.db import models


class 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.choices
    language = 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, EnumMeta

class LangaugeEnum(Enum):
    ch = 'Chinese'
    en = 'English'
    fr = 'French'

class Book(models.Model):
    name = models.CharField(max_length=128)
    # 注意这里的choices值的用法, 使用了 列表表达式
    # 和 default的赋值 LangaugeEnum.cn.name
    language = 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):
    pass


class LangaugeEnum(ChoiceEnum):
    ch = 'Chinese'
    en = 'English'
    fr = 'French'

class Book(models.Model):
    name = models.CharField(max_length=128)
    # 注意这里的choices值的用法: LangaugeEnum
    # 和 default的赋值 LangaugeEnum.cn.name
    language = 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-choice-enum

参考

关于django model fields中的choice用法

Enumeration types


如果觉得文章对你有所帮助,欢迎点赞和赞赏~

文章同步发布个人微信公众号,欢迎关注。第一时间获取最新发布

全栈运维/DailyJobOps

如果阅读过程中有任何问题,欢迎入群交流~

QQ交流群
本文标题: Django model中choice的使用总结
本文作者: 老鹰
发布时间: 2022-08-25 17
原始链接: http://newblog.colinspace.com/blog/post/26/
许可协议: 署名-非商业性使用 4.0 国际许可协议
转载请保留原文链接及作者