from django.db import models
[docs]class FieldHandler(object):
"""
Abstract base type for all field handlers.
A field handler is an object that you can use to define custom
behavior when searching a field of a model.
You might want to use a field handler if you are using a custom
model field, or if your query contains information that
requires client-side processing before being passed to
the database.
"""
db_type = None
[docs] @classmethod
def handles(cls, model, field):
raise NotImplemented
[docs] @classmethod
def prepare(cls, value):
return value
[docs]class StrFieldHandler(FieldHandler):
db_type = 'STR'
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, (models.CharField, models.TextField))
[docs]class LowerCaseStrFieldHandler(StrFieldHandler):
db_type = 'LCSTR'
[docs]class IPAddressFieldHandler(LowerCaseStrFieldHandler):
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, models.GenericIPAddressField)
[docs]class BooleanFieldHandler(FieldHandler):
db_type = 'BOOL'
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, models.BooleanField)
[docs]class IntegerFieldHandler(FieldHandler):
db_type = 'INT'
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, (models.IntegerField, models.AutoField))
[docs]class DateFieldHandler(FieldHandler):
db_type = 'DATE'
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, models.DateField)
[docs]class DateTimeFieldHandler(FieldHandler):
db_type = 'DATETIME'
[docs] @classmethod
def handles(cls, model, field):
return isinstance(field, models.DateTimeField)
type_registry = [
LowerCaseStrFieldHandler,
IPAddressFieldHandler,
BooleanFieldHandler,
IntegerFieldHandler,
DateTimeFieldHandler,
DateFieldHandler,
]