- January 19, 2011
- text field postgres charfield length max_length unlimited varchar
- 0 (after 0 ratings)
Unlimited-length character fields in Postgres perform the same as limited-length fields, and the Postgres manual suggests not arbitrarily limiting these fields. Unfortunately, Django does not provide a way to access unlimited-length character fields except using TextField, which is rendered differently in forms and in the admin, and has different connotations.
LongCharField is a way to avoid putting arbitrary max_length values where they aren't required. It will only work with databases that allow VARCHAR with no numeric parameters, such as Postgres. MySQL won't work.
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
from django.db import models from django.utils.translation import ugettext_lazy as _ class LongCharField(models.CharField): "A basically unlimited-length CharField." description = _("Unlimited-length string") def __init__(self, *args, **kwargs): kwargs['max_length'] = int(1e9) # Satisfy management validation. super(models.CharField, self).__init__(*args, **kwargs) # Don't add max-length validator like CharField does. def get_internal_type(self): # This has no function, since this value is used as a lookup in # db_type(). Put something that isn't known by django so it # raises an error if it is ever used. return 'LongCharField' def db_type(self, connection): # *** This is probably only compatible with Postgres. # 'varchar' with no max length is equivalent to 'text' in Postgres, # but put 'varchar' so we can tell LongCharFields from TextFields # when we're looking at the db. return 'varchar' def formfield(self, **kwargs): # Don't pass max_length to form field like CharField does. return super(models.CharField, self).formfield(**kwargs)