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

时间:2015-03-05 14:56:48

标签: django django-models

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)我在这里想念什么?是不是应该在保存时转换价值?

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:4)

定义选择时

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

存储在数据库中的值是1,2,3,而'删除''创建' etc ..只是标签,只是为了解释,prev选择导致这样的选择输入元素:

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

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

如果你想使用&#34;说话密钥&#34;您可以将它们定义为类属性,例如

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)

,没关系

答案 1 :(得分:4)

您的帖子中有几个问题:

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

action = MyModel(action='create')

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

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

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