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. load m2m fields objects by dirol 3 years, 10 months ago
  2. Multiple-Submit-Button Widget for Choice Field by Archatas 5 years, 8 months ago
  3. FieldAccessForm (per-field user access for forms derived from models) by Killarny 5 years, 6 months ago
  4. Hidden Forms by insin 6 years, 9 months ago
  5. DRY custom ModelAdmin.list_display methods with a decorator by exogen 5 years, 7 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?)