Джанго;возможно ли иметь значение по умолчанию для queryset - PullRequest
8 голосов
/ 18 января 2011
employee = Employee.objects.filter('age' = 99)

Мы предполагаем, что этот набор запросов пуст.

Если я использую employee[0], это вернет индекс из-за ошибки диапазона, поэтому возможно ли здесь значение None по умолчанию?

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

Ответы [ 4 ]

9 голосов
/ 18 января 2011

Если вы просто хотите получить один экземпляр, используйте get, а не filter:

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

Если этого не существует, вы получитеEmployee.DoesNotExist исключение, которое вам нужно поймать.Если существует более одного 99-летнего сотрудника, вы получите исключение Employee.MultipleObjectsReturned, которое вы можете захотеть отловить.

Всегда есть django-раздражающий 's get_object_or_Noneесли вам лень!

from annoying.functions import get_object_or_None

obj = get_object_or_None(Employee, age=99)

Если вы не хотите использовать все раздражающие django, вы всегда можете добавить get_object_or_None где-нибудь, это просто выглядит так:

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
6 голосов
/ 13 ноября 2014

В Django> = 1.6 есть метод first, поэтому вы можете просто сделать:

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

Обратите внимание, однако, что это имеет смысл, только если вы знаете, что QuerySet гарантированно возвратит либо 1или 0 результатов.

4 голосов
/ 18 января 2011

Это должно работать:

employee[0] if employee else None
1 голос
/ 18 января 2011
first_employee = employee[0] if employee.count() > 0 else None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...