Django ORM处理MySQL BIT(1)字段

Car*_*bés 7 mysql django orm

在Django应用程序中,我正在尝试访问使用Hibernate(Java ORM)创建的现有MySQL数据库.我使用以下方法反向设计模型:

$ manage.py inspectdb > models.py
Run Code Online (Sandbox Code Playgroud)

这从数据库创建了一个很好的模型文件,很多东西都很好.但我找不到如何正确访问布尔字段,这些字段由Hibernate映射为BIT(1)类型的列.

默认情况下,inspectdb脚本在模型中将这些字段创建为TextField,并添加注释,表示无法可靠地获取字段类型.我将这些更改为BooleanField但是使用admin打开了我的模型对象,但它不起作用(模型对象总是为这些字段获取值true).使用IntegerField也不会起作用(例如在管理员这些字段显示奇怪的非ascii字符).

在不更改数据库的情况下执行此操作的任何提示?(我需要现有的Hibernate映射和Java应用程序仍然可以使用数据库).


更多信息:我将这些字段保留为BooleanField,并使用交互式shell查看获取的值.它们返回为'\ x00'(当Java/Hibernate值为false时)和'\ x01'(当为true时),而不是Python布尔值"True"和"False".

>>> u = AppUser.objects.all()[0]
>>> u.account_expired
'\x00'
>>> u.account_enabled
'\x01'
Run Code Online (Sandbox Code Playgroud)

模型包括:

class AppUser(models.Model):
    account_expired = models.BooleanField()
    account_enabled = models.BooleanField(blank=True)
    # etc...
Run Code Online (Sandbox Code Playgroud)

Car*_*bés 10

这是德米特里建议的详细解决方案:

我派生的字段类:

class MySQLBooleanField(models.BooleanField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if isinstance(value, bool):
            return value
        return bytearray(value)[0]

    def get_db_prep_value(self, value):
        return '\x01' if value else '\x00'
Run Code Online (Sandbox Code Playgroud)

我的模型中的字段:

account_enabled = MySQLBooleanField()
account_expired = MySQLBooleanField()
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nko 2

我想唯一的方法是子类化,例如 BooleanField,并覆盖 to_python/get_prep_value 函数,以便该字段与 django 和您的数据库无缝工作。