Что делать, если queryset не имеет значения

У меня есть модель News, где каждый экземпляр имеет уникальную дату. Это означает, что каждый день имеет ровно один News-экземпляр, связанный с ним. Я перенаправляю на детальный просмотр экземпляра новости из навигационной панели.

Для достижения этой цели я использую context_processor. Файл context_processor.py выглядит следующим образом:

from news.models import TodayNews
import datetime


def todays_news(request):
    todays_news = TodayNews.objects.get(date=datetime.date.today())
    return {'news': todays_news} 

Это работает совершенно нормально до тех пор, пока модель News имеет экземпляр на эту конкретную дату. В противном случае возвращается следующая ошибка (что очень логично):

TodayNews matching query does not exist.

Мой вопрос заключается в том, как я могу сделать что-то другое, если запрос пуст, например, если у одной конкретной даты нет новости-объекта? Что я должен вернуть вместо 'news': todays_news?

Вы можете работать с try-except для возврата None в случае, если объект TodayNews не найден:

from news.models import TodayNews
import datetime

def todays_news(request):
    try:
        todays_news = TodayNews.objects.get(date=datetime.date.today())
    except TodayNews.DoesNotExist:
        todays_news = None
    return {'news': todays_news}

Вы также можете использовать .first() [Django-doc] для возврата первого элемента, это вернет None если ни один элемент не может быть найден:

from news.models import TodayNews
import datetime

def todays_news(request):
    todays_news = TodayNews.objects.filter(date=datetime.date.today()).first()
    return {'news': todays_news}
Вернуться на верх