在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)