在 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 将布尔值存储为 -1True0False。而不是修改数据库(它是一个 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 在 BooleanField 上注释

如何在 Django 上将 True 设置为 BooleanField 的默认值?

Django BooleanField 作为单选按钮?

自定义包含 django.forms.CheckboxInput() 的 django.forms.BooleanField() 的样式

mysql 的 Django BooleanField 默认值

Django:BooleanField 返回“on”而不是 true?