from django.db.models.fields import subclassing from django.core import exceptions from django.conf import settings from django.db import models class TrueNoneField(models.NullBooleanField): __metaclass__ = subclassing.SubfieldBase def db_type(self): if 'postgresql' in settings.DATABASE_ENGINE: return "boolean CHECK (%s <> false)" % self.get_attname_column()[1] else: return super(TrueNoneField, self).db_type() def to_python(self, value): if value in (True, 1): return True elif value in (False, 0, None): return None raise exceptions.ValidationError("This value must be either True or None.") def get_db_prep_save(self, value): return super(TrueNoneField, self).get_db_prep_save(self.to_python(value))