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 的选择包装器。
在 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 的选择包装器。