Django Custom Field - Boolean -> CHAR YN

Из-за унаследованной системы я пытаюсь заставить булевые поля Django сохраняться в dB как простое поле 'Y' или 'N' char (VARCHAR не поддерживается в указанной унаследованной системе).

Использование пользовательского поля django У меня оно работает, но я пытаюсь заставить Django admin работать с полем.

class BooleanYN(models.BooleanField):
    """ We need to save boolean variables as CHAR Y/N 

    """

    description = _("Boolean field stored as Y or N in the dB")

    def from_db_value(self, value, expression, connection):
        if value in ('Y', 'y'):
            return True
        if value in ('N', 'n'):
            return True
        raise ValidationError(_(f"Value in dB is not Y or N - {value}"))

    def get_prep_value(self, value):
        if value is True:
            return 'Y'
        if value is False:
            return 'N'
        return value

    def db_type(self, connection):
        return char(1)

В админке Django, вид одной записи + вид списка, виджет checkbox всегда отмечается как true, хотя 'N' правильно сохраняется в dB, и "to_python" правильно передается 'False' или 'True' как значение, когда его вызывает код modelform в зависимости от того, 'Y' или 'N' в dB.

Любая помощь приветствуется!

Я провел так много времени, сосредоточившись на исходном коде Django, что пропустил глупую ошибку в своем собственном коде, которую я скрыл от себя с помощью недопустимого протоколирования!

Changed :

    def from_db_value(self, value, expression, connection):
        if value in ('Y', 'y'):
            return True
        if value in ('N', 'n'):
            return True
        raise ValidationError(_(f"Value in dB is not Y or N - {value}"))

к :

    def from_db_value(self, value, expression, connection):
        if value in ('Y', 'y'):
            return True
        if value in ('N', 'n'):
            return False
        raise ValidationError(_(f"Value in dB is not Y or N - {value}"))

После этого проблем больше нет. Спасибо за ваш ответ nigel222

Вернуться на верх