让我们考虑一下这个模型:
class MyModel(models.Model):
DEFAULT = 1
NOT_DEFAULT = 2
SOMETHING = 3
SOMETHING_ELSE = 4
CHOICES = (
(DEFAULT, 'foo')
(NOT_DEFAULT, 'bar')
(SOMETHING, 'tar')
(SOMETHING_ELSE, 'oof')
)
field1 = models.CharField(
max_length=128,
)
field2 = models.SmallIntegerField(
choices=CHOICES,
default=DEFAULT
)
如何填写这些数据?
name, status
'one', 'foo'
'two', 'oof'
'tree', 'foo'
'four', 'foo'
'five', 'tar'
'six', 'bar'
不起作用,因为它需要一个整数
MyModel.objects.create('one','foo')
如果没有愚蠢的变通办法,我该怎么做呢?
是否有像
这样的内置映射'foo' -> 1
'oof' -> 4
等?
答案 0 :(得分:1)
你有元组CHOICES
的元组,你需要找到第二个元素的第一个元素。因此,您可以从元组生成dict并获取值,例如:
value = 'foo'
{v: k for k, v in MyModel.CHOICES}.get(value)
答案 1 :(得分:0)
According to the docs,当您定义一组选项时:
每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。例如:
您的field2
需要一个整数。它将存储该整数,并使用它配对的值来确定用于显示的人类可读值。例如,使用当前设置,值1
会映射到foo
。
考虑:
m = MyModel.objects.create(
field1 = 'MyText',
field2 = 1
)
m.field2
数据库中存储的值为1
,但在m.field2
的表单等中使用的人类可读名称为foo
,原因如何您已定义了CHOICES
。
答案 2 :(得分:0)
您可以修改模型以获得所需的结果。
class MyModel(models.Model):
DEFAULT = 'foo'
NOT_DEFAULT = 'bar'
SOMETHING = 'tar'
SOMETHING_ELSE = 'off'
CHOICES = (
(DEFAULT, 'foo')
(NOT_DEFAULT, 'bar')
(SOMETHING, 'tar')
(SOMETHING_ELSE, 'oof')
)
field1 = models.CharField(
max_length=128,
)
field2 = models.CharField(
choices=CHOICES,
default=DEFAULT
)