tags:

views:

89

answers:

1

In Django you can use the exclude to create SQL similar to not equal. An example could be.

Model.objects.exclude(status='deleted')

Now this works great and exclude is very flexible. Since I'm a bit lazy, I would like to get that functionality when using get_object_or_404, but I haven't found a way to do this, since you cannot use exclude on get_object_or_404.

What I want is to do something like this:

model = get_object_or_404(pk=id, status__exclude='deleted')

But unfortunately this doesn't work as there isn't an exclude query filter or similar. The best I've come up with so far is doing something like this:

object = get_object_or_404(pk=id)
if object.status == 'deleted':
    return HttpResponseNotfound('text')

Doing something like that, really defeats the point of using get_object_or_404, since it no longer is a handy one-liner.

Alternatively I could do:

object = get_object_or_404(pk=id, status__in=['list', 'of', 'items'])

But that wouldn't be very maintainable, as I would need to keep the list up to date.

I'm wondering if I'm missing some trick or feature in django to use get_object_or_404 to get the desired result?

+4  A: 

Use django.db.models.Q:

from django.db.models import Q

model = get_object_or_404(MyModel, ~Q(status='deleted'), pk=id)

The Q objects lets you do NOT (with ~ operator) and OR (with | operator) in addition to AND.

Note that the Q object must come before pk=id, because keyword arguments must come last in Python.

interjay
Of cause the Q object. Didn't know it would work in that contest. Thanx.
googletorp