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