from django.core.exceptions import ValidationError
from django.db import models
from django.db.models.sql import constants
from django.utils.translation import ugettext_lazy as _
class ObjectManager(models.Manager):
def filter_from_request(self, request):
"""
Generic model filter from request GET data
"""
qs = self.get_query_set()
filters = dict()
fields = [f.name for f in self.model._meta.fields]
for p in request.GET:
if constants.LOOKUP_SEP in p:
field_name, field_qterm = p.split(constants.LOOKUP_SEP)
else:
field_name = p
if field_qterm and field_qterm not in constants.QUERY_TERMS:
continue
if field_name in fields:
if request.GET.get(p) != '':
filters[p] = request.GET.get(p)
try:
qs = qs.filter(**filters)
except ValueError, e:
raise ValidationError(_(u'Error filter data'))
return qs
Comments
Hi, this is nice. I made something similar. Problem with this is, when invalid filters are passed to filter(). It will not not raise an exception from filter(), but at the time of queryset evaluation.
PS: try to modify your snippet to support other logical operators than AND...
#