在 Django 中为 BooleanField 使用不同的数据库值
Posted
技术标签:
【中文标题】在 Django 中为 BooleanField 使用不同的数据库值【英文标题】:Using different database values for BooleanField in Django 【发布时间】:2018-11-23 14:26:22 【问题描述】:我正在将旧的 MS Access 数据库转换为基于 Django 的网站。我已将数据转换为 SQLite 数据库,并使用 inspectdb
自动生成模型(效果与预期一样好)。
似乎 MS Access 将布尔值存储为 -1
的 True
和 0
的 False
。而不是修改数据库(它是一个 lot 的表!)我正在尝试继承 models.BooleanField
,如下所示:
class MsAccessBooleanField(models.BooleanField):
def from_db_value(self, value, expression, connection):
if value == -1:
return True
if value == 0:
return False
def to_python(self, value):
if value == -1:
return True
if value == 0:
return False
def get_prep_value(self, value):
if value == True:
return -1
if value == False:
return 0
return None
def get_db_prep_value(self, value, connection, prepared=False):
if value == True:
return -1
if value == False:
return 0
return None
当我通过管理界面查看条目时,这似乎有效(-1 值在下拉列表中显示为是;0 值显示为否)。
但是(这是问题所在),在修改值并保存时,我只能另存为 No 或 Unknown(选择 Yes 会产生一条消息,指出未指定任何值)。知道我可能做错了什么吗?
【问题讨论】:
您似乎正在覆盖应该用于转换值的方法。 对不起,你能解释一下吗?我不应该覆盖哪种方法? 什么是很多表?我仍然认为迁移是你最好的选择。 49...也许我还是应该进行迁移! @user2672537 你需要一个字符串而不是整数。 【参考方案1】:您只需更改BooleanField.to_python
def to_python(self, value):
if value in (True, False):
return bool(value)
if value in ('t', 'True', '1', '-1'):
return True
if value in ('f', 'False', '0'):
return False
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params='value': value,
)
【讨论】:
以上是关于在 Django 中为 BooleanField 使用不同的数据库值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 上将 True 设置为 BooleanField 的默认值?
自定义包含 django.forms.CheckboxInput() 的 django.forms.BooleanField() 的样式