get
и filter
являются широко используемыми методами запросов в Django ORM, и их возвращаемые значения являются наборами запросов, но есть некоторые различия.
get
метод:
- Используется для запроса одного объекта, если набор результатов запроса пуст или возвращает несколько результатов, он вызовет срабатывание
DoesNotExist
илиMultipleObjectsReturned
исключение. - Если набор результатов запроса пуст, вы можете использовать
get
второй параметр метода, чтобы установить значение по умолчанию, напримерModel.objects.get(pk=1, default=None)
- Поддерживает связывание вызовов с другими запросами, такими как
Model.objects.get(name='John').movies.all()
filter
метод:
- Используется для возврата набора запросов. Набор запросов может содержать 0 или более объектов.
- Поддерживает использование нескольких условий фильтрации, а несколько условий используют
AND
соединения по умолчанию, напримерModel.objects.filter(name='John', age=18)
- Поддерживает связывание вызовов с другими запросами, такими как
Model.objects.filter(name='John').order_by('-age')。
Вот примеры использования get
и filter
методов:
from myapp.models import Person
# 获取单个对象
person = Person.objects.get(name='John')
print(person)
# 使用 get 方法获取不存在的对象时,捕获 DoesNotExist 异常
try:
person = Person.objects.get(name='Tom')
except Person.DoesNotExist:
print('Person not found')
# 使用 `get` 方法第二个参数设置默认值
person = Person.objects.get(name='Tom', default=None)
if person is None:
print('Person not found')
# 获取查询集,使用 filter 方法
people = Person.objects.filter(age=18)
for person in people:
print(person)
# 使用多个筛选条件
people = Person.objects.filter(name='John', age=18)
for person in people:
print(person)
В приведенном выше примере мы myapp.models
сначала импортировали Person
из него модель и использовали get
метод для получения объекта John
с именем Person
. Затем мы поймали исключение get
, возникающее при использовании метода для получения несуществующего объекта DoesNotExist
, и показали, как использовать get
второй параметр метода для установки значения по умолчанию.
Затем мы использовали filter
этот метод, чтобы отфильтровать всех лиц, которым исполнилось 18 лет, и for
зациклились на наборе запросов.
Наконец, мы использовали filter
несколько фильтров метода, чтобы получить John
людей с именами и возрастом 18 лет.