django - How to get all possible filter options for a particular model across relationships? -


i'm trying expose flexible query interface powerusers of django application , need find every way filter given model in respect model hierarchy embedded in.

i have nested set of models this:

from django.db import models  class city(models.model):     name = models.charfield(max_length=15)  class team(models.model):     location = models.foreignkey(city)     name = models.charfield(max_length=15)  class employee(models.model):     teams = models.manytomanyfield(team)     location = models.foreignkey(city)  class task(models.model):     assignee = models.foreignkey(employee) 

with querysets can construct complex query, example finding tasks assigned employees munich:

tasks = task.objects.filter(assignee__location="munich") 

or more complex, going through m2m:

tasks = task.objects.filter(assignee__teams__location__="munich") 

i want guide users through process of constructing meaningful complex query , display choices have filter model task by, came algorithm:

def traverse(waiting,result=list(),grave=set()):     if not waiting:         # if there nothing waiting done         return     objekt, prefix = waiting.pop(0) # remove item front of queue     separation_character = "__" #django uses __ instead of . in query strings     newprefix=prefix     if prefix:         newprefix = prefix +separation_character     try:         modelname = objekt._meta.object_name         if modelname in grave:             # if current model name in graveyard, has been touched             # chain , doesn't need processed.             return          # know dealing complex object may have fields         grave.add(objekt._meta.object_name)         fields = objekt._meta.get_all_field_names()         field in fields:             # every attribute of field, create new tuple in waiting             try:                 waiting.append((getattr(objekt,field),newprefix+field))             except:                 pass          field in fields:             traverse(waiting, result, grave)     except:         # if objekt._meta doesn't exist, thing not complex object , can stop chain.         # add qualified path result         result.append(prefix)     return result 

this find filter possibilities given model following foreignkeys, stop on reverse foreignkeys , manytomanyfields.

how can extend algorithm give me possible filter options?


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -