I'd like to propose a new field type I've used on several projects. Its a list of boolean flags all in one field. It replaces the need for many Boolean fields and has the same basic DB lookup capabilities. This is fully Admin compatible and Database agnostic.
Here is the full code, I'm sure it could use some minor tweaks.
from django.db import models
from django.forms import MultipleChoiceField, CheckboxSelectMultiple
class FlagField(models.Field):
description = "A set of flags."
__metaclass__ = models.SubfieldBase
def __init__(self, flags, *args, **kwargs):
self.flags = flags
super(FlagField, self).__init__(*args, **kwargs)
def db_type(self, connection):
return 'char(%s)' % len(self.flags)
def to_python(self, value):
if isinstance(value, list) or isinstance(value, set):
flagged = set(value)
else:
flagged = set()
for i,c in enumerate(value):
if c == '1' and i < len(self.flags): flagged.add(self.flags[i])
return flagged
def get_db_prep_value(self, value, connection, prepared=False):
return ''.join(map(lambda flag: '1' if flag in value else '0', self.flags))
def formfield(self, **kwargs):
defaults = {'form_class': MultipleChoiceField, 'widget':CheckboxSelectMultiple, 'choices':map(lambda f: (f, f), self.flags)}
defaults.update(kwargs)
return super(FlagField, self).formfield(**defaults)
Regards,