8. Как отфильтровать набор запросов с критериями на основе сравнения значений их полей¶
Django ORM позволяет легко фильтровать на основе фиксированных значений. Чтобы получить все User
объекты с first_name
, начиная с 'R'
, вы можете сделать User.objects.filter(first_name__startswith='R')
.
Что если вы хотите сравнить имя_и фамилию? Вы можете использовать объект F
. Сначала создайте несколько пользователей.
In [27]: User.objects.create_user(email="shabda@example.com", username="shabda", first_name="Shabda", last_name="Raaj")
Out[27]: <User: shabda>
In [28]: User.objects.create_user(email="guido@example.com", username="Guido", first_name="Guido", last_name="Guido")
Out[28]: <User: Guido>
Теперь вы можете найти пользователей, у которых first_name==last_name
.
In [29]: User.objects.filter(last_name=F("first_name"))
Out[29]: <QuerySet [<User: Guido>]>
F
также работает с вычисляемым полем с помощью annotate. Что если нам нужны пользователи, чьи имя и фамилия содержат одну и ту же букву?
Вы можете установить первую букву из строки с помощью Substr("first_name", 1, 1)
, что мы и делаем.
In [41]: User.objects.create_user(email="guido@example.com", username="Tim", first_name="Tim", last_name="Teters")
Out[41]: <User: Tim>
#...
In [46]: User.objects.annotate(first=Substr("first_name", 1, 1), last=Substr("last_name", 1, 1)).filter(first=F("last"))
Out[46]: <QuerySet [<User: Guido>, <User: Tim>]>
F
может также использоваться с __gt
, __lt
и другими выражениями.