Django 模型选择对保存的数据没有影响

django model choices make no effect on saved data

django documentation 之后,我尝试在我的 models.py:

class MyModel(Model):

    ACTION_CHOICES = (
        ('d', 'delete'),
        ('c', 'create'),
        ('u', 'update'),
    )

    action = CharField(max_length=1, choices=ACTION_CHOICES)

但是当我运行它与

 action = MyModel(action='create')
 action.save()

并检查数据库操作不是c,而是create。此外,即使限制 max_length 也不会影响它。好的,我继续尝试以这种方式制作它:

models.py

class MyModel(Model):

    ACTION_CHOICES = (
        (1, 'delete'),
        (2, 'create'),
        (3, 'update'),
    )

    action = IntegerField(max_length=1, choices=ACTION_CHOICES)

code.py:

action = MyModel(action='create')
action.save()

但我得到一个错误,str 字段不能像 int 一样保存(数据库有 int 字段,但 MyModel.action 是 str)我在这里错过了什么?选择不应该在保存时转换价值吗?

此致,

定义选项时

ACTION_CHOICES = (
    (1, 'delete'),
    (2, 'create'),
    (3, 'update'),
)

db中存储的值是1、2、3,而'delete'、'create'等只是标签,只是为了解释,prev的选择结果是这样的select 输入元素:

<select>
    <option value="1">delete</option>
    <option value="2">create</option>
    <option value="3">update</option>
</select>

选择不应该在保存时转换值,应该将数据库值与标签映射,并在呈现表单小部件和检索字段表示时使用 (get_field_display)。但是如果你直接设置一个列的值,它就不起作用了。

如果您想使用 "talking keys",您可以将它们定义为 class 属性,例如

class MyModel(models.Model):
    DELETE_ACTION = 1
    CREATE_ACTION = 2
    UPDATE_ACTION = 3

    ACTION_CHOICES = (
        (DELETE_ACTION, 'delete'),
        (CREATE_ACTION, 'create'),
        (UPDATE_ACTION, 'update'),
    )

那你可以做

action = MyModel(action=MyModel.CREATE_ACTION)

会好的

你的post有几个问题:

1) choices 只能限制可以通过Django 表单输入的内容。当您手动实例化您的对象时,您可以插入任何值。所以

action = MyModel(action='create')

实际上是将字符串 create 插入到操作列中。

2) 通常 max_length 应该阻止您将长度超过 1 个字符的字符串插入该列,但我猜您使用的 SQLite 具有 no restriction on VARCHAR lengths.

3) Django 没有简单的从显示值到选择键的转换。您可以查看 django-model-utils 的选择包装器。