使用包含选项的字段创建模型实例

时间:2017-11-02 13:35:33

标签: python django django-models

让我们考虑一下这个模型:

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

等?

3 个答案:

答案 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
    )