StringListField (database field)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- coding: iso-8859-1 -*-
# $Id: StringListField.py 344 2009-05-06 06:57:27Z tguettler $
# $HeadURL: svn+ssh://svnserver/svn/djangotools/trunk/dbfields/StringListField.py $

# http://www.djangosnippets.org/snippets/1491/

# Django
from django.db import models
from django import forms

class StringListField(models.Field):
    u'''
    Save a list of strings in a CharField (or TextField) column.

    In the django model object the column is a list of strings.
    '''
    __metaclass__=models.SubfieldBase
    SPLIT_CHAR=u'\v'
    def __init__(self, *args, **kwargs):
        self.internal_type=kwargs.pop('internal_type', 'CharField') # or TextField
        super(StringListField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if isinstance(value, list):
            return value
        if value is None:
            return []
        return value.split(self.SPLIT_CHAR)

    def get_internal_type(self):
        return self.internal_type

    def get_db_prep_lookup(self, lookup_type, value):
        # SQL WHERE
        raise NotImplementedError()

    def get_db_prep_save(self, value):
        return self.SPLIT_CHAR.join(value)

    def formfield(self, **kwargs):
        assert not kwargs, kwargs
        return forms.MultipleChoiceField(choices=self.choices)

More like this

  1. Field List Tag by hughsaunders 9 months, 1 week ago
  2. The model field subclass returns string generated from the list of choices. by I159 2 months, 3 weeks ago
  3. Parse datetime model field to string by jzelez 1 year, 7 months ago
  4. path.py FilePathField by tino 1 year, 1 month ago
  5. Modify query string on a url by dnordberg 3 years, 7 months ago

Comments

dharris (on October 28, 2009):

I've modified this locally to handle saving and loading empty values better.

In get_db_prep_save (line 37-38), I added:

if not value:
    return None

without this, an empty string was saved -- I prefer a NULL in the db.

Line 26-27, I changed this to

if value is None or value == '':
    return []

#

(Forgotten your password?)