choices 模块

模块: borax.choices

简单示例

每个可选选项集合都继承自 choices.ConstChoices, 并使用 choices.Item 列出所有的可选项。

  1. from borax import choices
  2. class YearInSchoolChoices(choices.ConstChoices):
  3. FRESHMAN = choices.Item('FR', 'Freshman')
  4. SOPHOMORE = choices.Item('SO', 'Sophomore')
  5. JUNIOR = choices.Item('JR', 'Junior')
  6. SENIOR = choices.Item('SR', 'Senior')

可以直接使用 YearInShoolChoices.FRESHMAN 访问该选项具体的值。

  1. >>> YearInShoolChoices.FRESHMAN
  2. 'FR'
  3. >>> YearInShoolChoices.is_valid('SR')
  4. True
  5. >>> YearInShoolChoices.is_valid('Et')
  6. False

选项(Item)定义

在类定义体使用 <name> = <value> 的格式定义选项。

名称 name 遵循 Python 变量命名规范,需要注意的是:

  • 以下划线(”_”)开始的变量不视为一个有效的选项
  • 变量名并不是必须使用大写形式

值 value 通常为一个 Item 对象,定义如下:

  1. def __init__(value, display=None, *, order=None):pass

参数说明如下:

  • value : 保存的值,在一个 Choices 中该值是唯一的
  • display : 可读的文本信息
  • order :用于升序排列的关键数字

选项复用和继承

可以使用类继承的方式实现选项的复用和重新定制某些选项的属性。

  1. from borax import choices
  2. class VerticalChoices(choices.ConstChoices):
  3. S = choices.Item('S', 'south')
  4. N = choices.Item('N', 'north')
  5. class DirectionChoices(VerticalChoices):
  6. E = choices.Item('E', 'east')
  7. W = choices.Item('W', 'west')

默认情况下,子类的选项在父类选项之后,但可以使用 order 属性以调整顺序。

简单选项

在某些选项稀少、意义明确的情况下,可以只使用简单的数据类型定义选项,这些形式包括:

  • 含有2个元素的列表或元组
  • 一个单值对象,仅限 intfloatstrbytes 四种类型

ConstChoices 将自动生成一个新的 Item 对象。以下四个语句是等效的:

  1. NS = choices.Item('A', 'A')
  2. NS = choices.Item('A')
  3. NS = 'A', 'A'
  4. NS = 'A'

例如上述 YearInSchoolChoices 也可以简写为

  1. class YearInSchoolChoices(choices.ConstChoices):
  2. FRESHMAN = 'FR', 'Freshman'
  3. SOPHOMORE = 'SO', 'Sophomore'
  4. JUNIOR = 'JR', 'Junior'
  5. SENIOR = 'SR', 'Senior'

整合到 Django

未使用 borax.choices 时:

  1. from django.db import models
  2. class Student(models.Model):
  3. MALE = 'male'
  4. FEMALE = 'female'
  5. UNKOWN = 'unkown'
  6. GENDER_CHOICES = (
  7. (MALE, 'male'),
  8. (FEMALE, 'famale'),
  9. (UNKOWN, 'unkown')
  10. )
  11. gender = models.IntergerFIeld(
  12. choices=GENDER_CHOICES,
  13. default=UNKOWN
  14. )

使用后:

  1. from django.db import models
  2. from borax import choices
  3. class GenderChoices(choices.ConstChoices):
  4. MALE = choices.Item(1, 'male')
  5. FEMALE = choices.Item(2, 'female')
  6. UNKOWN = choices.Item(3, 'unkown')
  7. class Student(models.Model):
  8. gender = models.IntergerFIeld(
  9. choices=GenderChoices,
  10. default=GenderChoices.UNKOWN
  11. )

方法 API

以下所有的方法均为 ConstChoices 类的属性和方法。

  • ConstChoices.choices

所有选项列表。可直接用于 django.models.Field.choices 。

类似于 [(value1, display1), (value2, display2), ...]

  • ConstChoices.is_valid(value)

检查 value 是否是有效的选项。

  • ConstChoices.get_value_display(value)

获取某个选项的文本。

  • ConstChoices.__iter__()

遍历 ConstChoices.choices