在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)我在这里想念什么?是不是应该在保存时转换价值?
致以最诚挚的问候,
答案 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以获取有关选择的包装。