Search code examples
django

Django; is it possible to have a default value for queryset


employee = Employee.objects.filter('age' = 99)

We assume this queryset is empty.

If I use employee[0], that will return index out of range error, so is it possible to have a None as default value here?

`employee[0] or None`? # This won't work, but this is what I mean.

Solution

  • If you just want to get a single instance, use get, not filter:

    employee = Employee.objects.get(age = 99)
    

    If that doesn't exist, you'll get a Employee.DoesNotExist exception, which you'll need to catch. If there's more than one 99 year-old employee, you'll get a Employee.MultipleObjectsReturned exception, which you may want to catch.

    There's always django-annoying's get_object_or_None if you're feeling lazy!

    from annoying.functions import get_object_or_None
    
    obj = get_object_or_None(Employee, age=99)
    

    If you don't want to use all of django-annoying, you can always add get_object_or_None somewhere, it just looks like this:

    def get_object_or_None(klass, *args, **kwargs):
        """
        Uses get() to return an object or None if the object does not exist.
    
        klass may be a Model, Manager, or QuerySet object. All other passed
        arguments and keyword arguments are used in the get() query.
    
        Note: Like with get(), a MultipleObjectsReturned will be raised if
        more than one object is found.
        """
        queryset = _get_queryset(klass)
        try:
            return queryset.get(*args, **kwargs)
        except queryset.model.DoesNotExist:
            return None