Agreed - if we were going to implement this, we'd use a bit string implementation, not push it into a char field.
Yours, Russ Magee %-) On Sat, Nov 2, 2013 at 4:22 AM, Michael Manfre <[email protected]> wrote: > Storing bits as a string is not an efficient use of space and is slower to > query. Any reason why you are not using the bit datatype with a length? > E.g. 'bit(%s)' % len(self.flags) > > Regards, > Michael Manfre > > > On Fri, Nov 1, 2013 at 3:50 PM, Paul Kenjora <[email protected]> wrote: > >> Hi, >> >> 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, >> >> >> -- >> - Paul Kenjora >> - 602-214-7285 >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django developers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/django-developers. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-developers/CAEH8JE3356WqGVgF9fNxYhTXs%2BVDNVm-iryTBCoFoB6bXcxOgA%40mail.gmail.com >> . >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/django-developers. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-developers/CAGdCwBupWAWf1%2Bp%2BxJF7Ttq8EV%3DzDZPA689DCB9SF2G7HQCh2A%40mail.gmail.com > . > > For more options, visit https://groups.google.com/groups/opt_out. > -- You received this message because you are subscribed to the Google Groups "Django developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAJxq84-D72wmeCwohiyGD0bGfFC9bu2Pbbhj-u3Yb_aKL-v%2BKw%40mail.gmail.com. For more options, visit https://groups.google.com/groups/opt_out.
