要求从文件中澄清Django车型选择代码
在官方文件中,我们给出了以下示例:要求从文件中澄清Django车型选择代码,django,choicefield,Django,Choicefield,在官方文件中,我们给出了以下示例: class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' YEAR_IN_SCHOOL_CHOICES = ( (FRESHMAN, 'Freshman'), (SOPHOMORE, 'Sophomore'), (JUNIOR, 'Junior'),
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = (
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
)
year_in_school = models.CharField(max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN)
将变量设置为字符串的目的是什么?在学校选择的YEAR\u的实际元组之前以及之外
?
那些字符串在哪里使用?
这些变量与元组中使用的变量相同吗?
若然,原因为何?这似乎是一个额外的、不必要的步骤
在本例之前的示例中,他们使用不同的学年选择
,这并没有帮助。谢谢你的澄清
更新
因为我坐在这里,在我们说话的时候正在与这个代码搏斗,感谢大家的快速响应。它们都增加了我的理解力。我认为@shang wang对我的问题有着迄今为止最简洁、最有反应的回答。1+用于获取_FOO_display()的引用。但在我的特定用例中,管理员可以选择告诉最终用户如何评估特定对象。因此,我希望评估的“人类可读”形式是最终html模板中显示给站点最终用户的内容。根据这些答案,现在我想知道这是否是实现我的目标的最佳方式?解决方案是:
`
html显示表
对象名称|评估
FOO | FOO.get_evaluation_display()
或者可能:
对于对象中的FOO:对象名称|评估
FOO.name | FOO.get_evaluation_display()
" 此特定模型的目的是向最终用户显示专家对FOO的评估。每个FOO可以有许多这样的评估。虽然这些评估通常非常详细,但可以进行分类,因此选择字段。如果用户愿意,可以单击“上一页”以完整阅读原始评估。因此,FOO是在不同的模型上定义的,并通过外键链接到评估模型。那么get_FOO_display()在这里实际工作吗,因为选择字段不在FOO是实例的模型上
p、 我意识到这已经变成了一个不同的问题,所以如果它需要移动或其他什么,我同意,但它确实直接来自原始问答。让我知道。Thx 变量
YEAR\u IN_SCHOOL\u CHOICES
作为字段YEAR\u IN_SCHOOL
中的所有可能选项。每对中的第一个值将存储在数据库中,而每对中的第二个值将显示在表单下拉列表中(如果使用默认小部件)。像FRESHMAN='FR'
这样的单独选择声明是为了确保它们被封装在类中。可以对每个学生对象执行以下操作:
# assign the value to student's year_in_school
student.year_in_school = Student.FRESHMAN
student.save()
# this will print 'FR'
db_value = student.year_in_school
print db_value
# this will print 'Freshman'
pretty_display_value = student.get_year_in_school_display()
print pretty_display_value
Django doc for.变量
YEAR\u IN\u SCHOOL\u选项
在YEAR\u IN\u SCHOOL
字段中用作所有可能的选项。每对中的第一个值将存储在数据库中,而每对中的第二个值将显示在表单下拉列表中(如果使用默认小部件)。像FRESHMAN='FR'
这样的单独选择声明是为了确保它们被封装在类中。可以对每个学生对象执行以下操作:
# assign the value to student's year_in_school
student.year_in_school = Student.FRESHMAN
student.save()
# this will print 'FR'
db_value = student.year_in_school
print db_value
# this will print 'Freshman'
pretty_display_value = student.get_year_in_school_display()
print pretty_display_value
Django doc for.文档似乎解释了示例后面段落中的推理 尽管您可以在模型类之外定义一个选项列表 请参考它,为该文档中的每个选项定义选项和名称 模型类将所有这些信息保存在使用它的类中, 并使选择易于参考(例如,
学生。大二学生将
在已导入学生模型的任何位置工作)
他们似乎建议最好使用options类变量,这样就不必引用原始val(例如,'FR'
)。它还可以确保您在导入此模型的任何地方都可以访问这些变量。文档似乎解释了示例后面段落中的推理
# within your models.Model class...
STUDENT_TYPE_CHOICES = (
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
)
year_in_school = models.CharField(max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN)
This means elsewhere in your code if you want to specify a choice field value, you’d have to enter the first slot of the tuple’s value, e.g.:
year_in_school = models.objects.filter(year_in_school_type='SOPHOMORE')
**This is pretty terrible** since it’s hardcoded in our source, possibly over many files.
尽管您可以在模型类之外定义一个选项列表
请参考它,为该文档中的每个选项定义选项和名称
模型类将所有这些信息保存在使用它的类中,
并使选择易于参考(例如,学生。大二学生将
在已导入学生模型的任何位置工作)
他们似乎建议最好使用options类变量,这样就不必引用原始val(例如,'FR'
)。它还可以确保您在导入此模型的任何地方都可以访问这些变量
# within your models.Model class...
STUDENT_TYPE_CHOICES = (
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
)
year_in_school = models.CharField(max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN)
This means elsewhere in your code if you want to specify a choice field value, you’d have to enter the first slot of the tuple’s value, e.g.:
year_in_school = models.objects.filter(year_in_school_type='SOPHOMORE')
**This is pretty terrible** since it’s hardcoded in our source, possibly over many files.
要避免使用以下类别:
pip安装enum34
进口检验
从枚举导入枚举
class ChoiceEnum(Enum):
@classmethod
def choices(cls):
# get all members of the class
members = inspect.getmembers(cls, lambda m: not(inspect.isroutine(m)))
# filter down to just properties
props = [m for m in members if not(m[0][:2] == '__')]
# format into django choice tuple
choices = tuple([(str(p[1].value), p[0]) for p in props])
return choices
**That’s the hard work over.**
Now you create your choice field:
from common.utils import ChoiceEnum
class StudentTypes(ChoiceEnum):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
# within your models.Model class...
year_in_school = models.CharField(max_length=1, choices=StudentTypes.choices())
Now if we need to access StudentTypes from elsewhere in our source code, we can simply:
# import StudentTypes
year_in_school = models.objects.filter(year_in_school=StudentTypes.junior.value)
要避免使用以下类别:
pip安装enum34
进口检验
从枚举导入枚举
class ChoiceEnum(Enum):
@classmethod
def choices(cls):
# get all members of the class
members = inspect.getmembers(cls, lambda m: not(inspect.isroutine(m)))
# filter down to just properties
props = [m for m in members if not(m[0][:2] == '__')]
# format into django choice tuple
choices = tuple([(str(p[1].value), p[0]) for p in props])
return choices
**That’s the hard work over.**
Now you create your choice field:
from common.utils import ChoiceEnum
class StudentTypes(ChoiceEnum):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
# within your models.Model class...
year_in_school = models.CharField(max_length=1, choices=StudentTypes.choices())
Now if we need to access StudentTypes from elsewhere in our source code, we can simply:
# import StudentTypes
year_in_school = models.objects.filter(year_in_school=StudentTypes.junior.value)