【问题标题】:Django ORM: can I have a BooleanField associated to a char column in the database?Django ORM:我可以将 BooleanField 关联到数据库中的 char 列吗?
【发布时间】:2012-01-30 18:39:03
【问题描述】:

我从我们拥有的旧系统“继承”了一个数据库,其中(除其他丑陋的东西外)某个表中有一个应该是布尔值的列,而不是带有 'N' 或 ' 的 varchar(1) 0' 代表假,'Y' 或 '1' 代表真(代码的不同部分在编写时使用一种或另一种约定,但显然它们都能够在阅读时识别两者)。

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

我想让模型类中的字段在外部显示为布尔值,因此当最终更正数据库时,我唯一需要在代码中将字段更改为普通字段布尔字段。有没有简单的方法来做到这一点?

【问题讨论】:

标签: python django orm


【解决方案1】:

您可以通过子类化django.db.models.Field 和实现to_python 方法(例如)来创建自己的字段类。

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

希望这会给你一些见解:)

【讨论】:

  • 难道你不应该也实现 get_prep_value() 将布尔值转换回字符以存储在数据库中吗?
  • @Ron: 是的,我忘了写数据库,+1 给你 :)
【解决方案2】:

我的情况类似,但遗留数据始终使用 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多