> I'd like to make a filter composed by ORing several Q objects, each of
> which acts on a different model field.
> For example I have a model with the fields "name", "title",
> "description" and I want to make a Q object like the following:
> Q_name = (Q(name__istartswith="hello") & Q(name__icontains="how are
> you"))
> Q_title = (Q(title__istartswith="hello") & Q(title__icontains="how are
> you"))
> Q_description = (Q(description__istartswith="hello") &
> Q(description__icontains="how are you"))
> Q_final = (Q_name | Q_title | Q_description)
> 
> Is it possible to avoid writing a Q object for each field and instead
> simply generate it by passing the field (name, title and description)
> as parameter? 

Just as an aside, the Q object takes multiple parameters that get
AND'ed together, so those can be written in the form

  Q_name = Q(
    name__istartswith='hello',
    name__icontains='how are you'
    )

without the need for two diff. objects to "&" together.

You can write a helper function and then use keyword expansion to
do the heavy lifting if you wanted.  That would look something like

  def start_has(fieldname, start, contain):
    return {
      fieldname + '__istartswith': start,
      fieldname + '__icontains': contain,
      }

  Q_name = Q(**start_has('name', 'hello', 'how are you'))
  Q_description = Q(**start_has('description', 'hello', 'how are
you'))
  Q_title = Q(**start_has('name', 'title', 'how are you'))

If this is within a view, you can even exploit closures (I think
this is a use of a closure) to do something like

  def my_view(request, *args, **kwargs):
    start = 'hello' # assign from request
    has = 'how are you' # assign from request
    def start_has(fieldname):
      return {
        fieldname + '__istartswith': start,
        fieldname + '__icontains': has,
        }
    things = models.Thing.objects.filter(
      Q(**start_has('name')) |
      Q(**start_has('title')) |
      Q(**start_has('description'))
      )

The above is 100% untested, but should work from what I've done
with Python/Django in the past, perhaps with a few lurking
errors I might have missed.

-tim




--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to