В приложении Django я пытаюсь получить доступ к существующей базе данных MySQL, созданной с, в спящем режиме (Java ORM). Я перепроектировал образцовое использование:
$ manage.py inspectdb > models.py
Это создало хороший файл моделей из Базы данных, и много вещей были прекрасны довольно. Но я не могу найти, как правильно получить доступ к булевым полям, которые были отображены, в спящем режиме как столбцы типа BIT (1).
inspectdb сценарий по умолчанию создает эти поля в модели как TextField и добавляет комментарий, говоря, что это не могло надежно получить тип поля. Я изменил их на BooleanField, но и открыл мои объекты модели с помощью администратора, но он не работает (объекты модели всегда выбирают значение истинных для этих полей). Используя IntegerField не будет работать также (например, в администраторе эти поля показывают странные символы неASCII).
Какие-либо подсказки выполнения этого, не изменяя базу данных? (Мне нужно существующее, в спящем режиме отображения и JAVA-приложение для тихой работы с базой данных).
Дальнейшая информация: Я покинул эти поля как BooleanField и использовал интерактивную оболочку для рассмотрения выбранных значений. Они возвращаются как '\x00' (когда значение Java/быть в спящем режиме является ложью), и '\x01' (когда верный), вместо булевых значений Python, "Верных" и "Ложных".
>>> u = AppUser.objects.all()[0]
>>> u.account_expired
'\x00'
>>> u.account_enabled
'\x01'
Где модель включает:
class AppUser(models.Model):
account_expired = models.BooleanField()
account_enabled = models.BooleanField(blank=True)
# etc...
Я предполагаю, что единственный способ - создать подкласс, скажем, BooleanField и переопределить функции to_python / get_prep_value, чтобы поле без проблем работало с django и {{1} } ваш db.
Это подробное решение из предложения Дмитрия:
Мой производный класс поля:
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'
Поля в моей модели:
account_enabled = MySQLBooleanField()
account_expired = MySQLBooleanField()