Как использовать связанный поиск в Django?
Я заметил, что реляционные поля Django регистрируют 7 поисков:
fk.get_lookups()
'in' : <class 'django.db.models.fields.related_lookups.RelatedIn'>,
'exact' : <class 'django.db.models.fields.related_lookups.RelatedExact'>,
'lt' : <class 'django.db.models.fields.related_lookups.RelatedLessThan'>,
'gt' : <class 'django.db.models.fields.related_lookups.RelatedGreaterThan'>,
'gte' : <class 'django.db.models.fields.related_lookups.RelatedGreaterThanOrEqual'>,
'lte' : <class 'django.db.models.fields.related_lookups.RelatedLessThanOrEqual'>,
'isnull' : <class 'django.db.models.fields.related_lookups.RelatedIsNull'>}
defined in https://github.com/django/django/blob/stable/3.2.x/django/db/models/fields/related_lookups.py
registered in https://github.com/django/django/blob/stable/3.2.x/django/db/models/fields/related.py
Я знаю, как использовать __exact
(он же =
), __in
и __isnull
с отношениями, но в документации нет упоминания о том, что значит применять lt / lte / gt / gte к отношению. Являются ли они сравнениями множеств?
__lt
: меньше чем (получить записи, которые меньше определенного значения) эквивалентно<
.
__gt
: больше чем (получить записи, которые больше определенного значения) эквивалентно>
.
__lte
: меньше или равно (получить записи, которые меньше или равны определенному значению) эквивалентно=<
__gte
: больше или равно (получить записи, которые больше или равны определенному значению) эквивалентно=>
.
Пример:
.filter(score__lt=100)
: объекты с баллом менее 100.
SQL эквивалент: WHERE score < 3;
.filter(id__lte=3)
: объекты с id меньше или равным 3.
SQL эквивалент: WHERE id <= 3;
- Вы также можете комбинировать эти поиски с функцией
F
:
.filter(rating__lt=F('number_of_comments')
Вы можете посмотреть больше примеров в Django Docs.