Generic model filter from request GET data

 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
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

More like this

  1. FieldAccessForm (per-field user access for forms derived from models) by Killarny 4 years, 7 months ago
  2. load m2m fields objects by dirol 2 years, 11 months ago
  3. Fieldsets for Views by Nad/ 3 years, 3 months ago
  4. caching parsed templates by forgems 5 years, 5 months ago
  5. Django Number Input by silent1mezzo 2 years, 3 months ago

Comments

diverman (on August 1, 2011):

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...

#

(Forgotten your password?)