Короткий ответ
get() возвращает ровно один объект и выбрасывает исключения DoesNotExist или MultipleObjectsReturned, если число записей не совпадает. filter() возвращает QuerySet со всеми подходящими объектами, и пустой результат для него нормален.
Как это работает подробнее
Методы различаются ожидаемым числом записей и типом результата.
- get(). Уместен, когда условие гарантированно выделяет единственную запись, например первичный ключ: Student.objects.get(id=1).
- filter(). Возвращает QuerySet с одной, несколькими или ни одной записью, который можно дальше уточнять и сортировать.
- Исключения. DoesNotExist и MultipleObjectsReturned обрабатываются через try/except с классами исключений Django.
- Тип результата. get() сразу даёт экземпляр модели, а filter() — ленивый QuerySet, который выполняется при обращении к данным.
Пример кода
get() и filter() на практике
# get(): ровно один объект
student = Student.objects.get(id=1)
print(student.name)
# filter(): QuerySet из всех подходящих объектов
students = Student.objects.filter(course='CSE')
for student in students:
print(student.name)Что использовать на практике
- Уникальные поля. Используй get() для поиска по id или другому уникальному полю.
- Произвольный набор. Используй filter(), когда результат может быть пустым или множественным.
- Обработка ошибок. Оборачивай get() в try/except, если записи может не оказаться.
Подводные камни
- Пустой результат. get() без записи бросает DoesNotExist, а не возвращает None, поэтому не забывай обрабатывать исключение.
- Несколько записей. Если условию отвечает много строк, get() бросит MultipleObjectsReturned, а не возьмёт первую.
- Хрупкая единственность. get() там, где нужен набор записей, падает при росте данных.
Как отвечать на собеседовании
- Опиши каждый метод через число возвращаемых записей → объясни исключения get() → приведи пример с id и course → дай правило: get() для уникального, filter() для произвольного набора, и упомяни ленивость filter().