Python Django ORM:我可以让一个布尔字段与数据库中的一个字符列相关联吗?

Python Django ORM:我可以让一个布尔字段与数据库中的一个字符列相关联吗?,python,django,orm,Python,Django,Orm,我从一个旧系统“继承”了一个数据库,其中(除其他难看的事情外)某个表中有一列应该是布尔值,而它是一个varchar(1),其中“N”或“0”表示false,“Y”或“1”表示true(代码的不同部分在编写时使用一种或另一种约定,但显然所有部分在读取时都能够识别这两种约定) 我正在将最初用Java编写的系统移植/重写到Python+Django,只有在移植完成后,我才能关闭旧系统并“清理”数据库混乱 我想让model类中的字段在外部显示为布尔值,因此当数据库最终被更正时,我在代码中要做的唯一一件事

我从一个旧系统“继承”了一个数据库,其中(除其他难看的事情外)某个表中有一列应该是布尔值,而它是一个varchar(1),其中“N”或“0”表示false,“Y”或“1”表示true(代码的不同部分在编写时使用一种或另一种约定,但显然所有部分在读取时都能够识别这两种约定)

我正在将最初用Java编写的系统移植/重写到Python+Django,只有在移植完成后,我才能关闭旧系统并“清理”数据库混乱


我想让model类中的字段在外部显示为布尔值,因此当数据库最终被更正时,我在代码中要做的唯一一件事就是将字段更改为纯布尔值字段。有没有一种简单的方法可以做到这一点?

您可以通过子类化和实现来创建自己的字段类使用这种方法

from django.db import models

class MyField(models.CharField):

     def to_python(self, value):
         if value in ('Y', '1'):
             return True
         if value in ('N', '0'):
             return False
         raise ValueError

希望这能给您一些启示:)

您可以创建自己的字段类,通过子类化和实现方法(例如

from django.db import models

class MyField(models.CharField):

     def to_python(self, value):
         if value in ('Y', '1'):
             return True
         if value in ('N', '0'):
             return False
         raise ValueError

希望这能给您一些启示:)

我的情况类似,但遗留数据始终使用Y和N来表示True和False,但我有一些字段允许Null的加法问题。下面是我的自定义字段类型。我认为它们是一个更完整的例子,说明了在这种情况下可以做什么,我还继承了BooleanField类型,我认为它更适合在表单中显示/编辑这些字段

from django.db import models

class YNBooleanField(models.BooleanField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 1
        super(YNBooleanField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if value in ('Y', 'y'):
            return True
        elif value in ('N', 'n'):
            return False
        else:
            raise ValueError

    def get_prep_value(self, value):
        if value:
            return 'Y'
        else:
            return 'N'

class NullYNBooleanField(models.NullBooleanField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 1
        super(NullYNBooleanField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if value is None:
            return None
        elif value in ('Y', 'y'):
            return True
        elif value in ('N', 'n'):
            return False
        else:
            raise ValueError

    def get_prep_value(self, value):
        if value is None:
            return None
        elif value:
            return 'Y'
        else:
            return 'N'

我的情况类似,但遗留数据始终使用Y和N来表示True和False,但我有一些字段允许Null的加法问题。下面是我的自定义字段类型。我认为它们是一个更完整的例子,说明了在这种情况下可以做什么,我还继承了BooleanField类型,我认为它更适合在表单中显示/编辑这些字段

from django.db import models

class YNBooleanField(models.BooleanField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 1
        super(YNBooleanField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if value in ('Y', 'y'):
            return True
        elif value in ('N', 'n'):
            return False
        else:
            raise ValueError

    def get_prep_value(self, value):
        if value:
            return 'Y'
        else:
            return 'N'

class NullYNBooleanField(models.NullBooleanField):

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 1
        super(NullYNBooleanField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if value is None:
            return None
        elif value in ('Y', 'y'):
            return True
        elif value in ('N', 'n'):
            return False
        else:
            raise ValueError

    def get_prep_value(self, value):
        if value is None:
            return None
        elif value:
            return 'Y'
        else:
            return 'N'

你不应该也实现get_prep_value()来将布尔值转换回字符以存储在数据库中吗?@Ron:是的,我忘了在数据库中写入,+1:)你不应该也实现get_prep_value()来将布尔值转换回字符以存储在数据库中吗?@Ron:是的,我忘了在数据库中写入,+1对你来说:)有一个相关的重要提示在