Django ORM, имеющий дело с полем MySQL BIT (1)

В приложении 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...
7
задан Carles Barrobés 24 April 2010 в 22:07
поделиться

2 ответа

Я предполагаю, что единственный способ - создать подкласс, скажем, BooleanField и переопределить функции to_python / get_prep_value, чтобы поле без проблем работало с django и {{1} } ваш db.

2
ответ дан 6 December 2019 в 14:02
поделиться

Это подробное решение из предложения Дмитрия:

Мой производный класс поля:

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()
10
ответ дан 6 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: