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 foreignkey
s, stop on reverse foreignkey
s , manytomanyfield
s.
how can extend algorithm give me possible filter options?
Comments
Post a Comment