Hello Bruno, Karen Tracey solved my issue and now i will be able to apply those refactoring you suggested me.
Thanks for tips :-) Att Thiago On Jan 19, 7:18 pm, bruno desthuilliers <bruno.desthuilli...@gmail.com> wrote: > On 19 jan, 18:04, "Thiago F. Crepaldi" <togn...@gmail.com> wrote: > > Absolutely not an answer to your question, but... > > > below is the code required. I hope you can help me =) > > #***************************************************************************************************************************************************************** > > > # searchFeature > > #***************************************************************************************************************************************************************** > > > def searchFeature(request, view = None): > > if request.method == 'POST': > > form = SearchFeatureForm(request.POST) > > if form.is_valid(): > > # Perform the query > > > ftrQuery = Feature.objects.all().order_by('featureId', > > 'pk') > > Since your going to filter this out, starting by querying all is > useless (thanks to querysets being lazy, it's at least _only_ useless. > > Remember that Django has Q objects for building complex queries, and > that you can just collect Q objects in a list, then "or" or (like in > this case) "and" them together in just one pass. > > > > > # Remove empty fields and start filtering > > if request.POST.__getitem__('featureId') != "": > > First point : you should never directly access __magic_methods__ in > Python - they are here as implementation for operators. In this case, > you want: > > if request.POST.get('featureId', '') != '': > > Second point: since empty strings eval to false in a boolean context, > you don't have to explicitely compare them with the empty string. IOW: > > if request.POST.get('featureId, ''): > > > ftrQuery = ftrQuery.filter(featureId__contains = > > request.POST.__getitem__('featureId')).distinct() > > Third point : you're doing the same access twice. Better to do it just > once: > > featureId = request.POST.get('featureId, '') > if featureId: > # code here > > While we're at it, attribute lookup is a somewhat costly operation in > Python, specially when the attribute resolves to a method. So if > you're going to heavily use the same method of the same object, it's > better to alias it to a local name: > > get_from_post = request.POST.get > > featureId = get_from_post('featureId, '') > if featureId: > # code here > > While we're at it : your form object is supposed to give you access to > the validated (and possibly converted) data extracted from the > request. Is there any reason to not use this feature ? > > Next point : you can pass dict objects to Queryset.filter(), (or to Q > objects) using the ** notation (cf the section of the official Python > tutorial about functions and named / keyword arguments). So you could > greatly simplify you code: > > filters = [ > # fieldname, lookup > ("featureId", "featureId__contains"), > ("name", "name__icontains") > ("pf", "platform"), > ("state", "state"), > ("db", "drumbeat__pk"), > # etc > ] > > queries = [] > add_q = queries.append > for fieldname, lookup in filters: > value = get_from_post(fieldname, '') > if value: > add_q(Q(**{lookup:value})) > > # now "and" the Q objects: > filters = reduce(lambda q1, q1 : q1 & q2, filters) > > # and do the query: > if filters: > queryset = Feature.objects.filter(filters) > else: > queryset = Feature.objects.all() > > queryset = queryset.order_by('featureId', 'pk') > > This can not apply to all your query construction (there are some > complex cases in it), but it should already help uncluttering it for > all the simple cases. > > (snip) > > > from datetime import date > > Better to put import statements at the module's top-level. > > > #Only way I could find to select with COUNT without > > writting the SQL code. > > You might have a look at the example snippet for the 'extra' method of > querysets. > > > if queryTeamSizeLow != '': > > for item in ftrQuery: > > if item.teammember_set.count() < int > > (queryTeamSizeLow): > > Oh my. Pity this poor computer, and at least convert queryTeamSizeLow > to an int only once... > > > ftrQuery = ftrQuery.exclude > > (featureId=item.featureId) > > > if queryTeamSizeHigh != '': > > for item in ftrQuery: > > if item.teammember_set.count() > int > > (queryTeamSizeHigh): > > ftrQuery = ftrQuery.exclude > > (featureId=item.featureId) > > Ok. Some things are better done building raw sql queries. Django's ORM > is here to help with the easy and boring 80%, not to replace SQL. > > My 2 cents... > > (snip) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---