Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Запрос и фильтрация
1. Как найти запрос, связанный с набором запросов?
2. Как делать OR-запросы в Django ORM?
3. Как делать AND-запросы в Django ORM?
4. Как сделать NOT запрос в Django queryset?
5. Как выполнить объединение двух наборов запросов из одной или разных
моделей?
6. Как выбрать только некоторые поля в наборе запросов?
7. Как сделать подзапросное выражение в Django?
8. Как отфильтровать набор запросов с критериями на основе сравнения
значений их полей
9. Как отфильтровать поле FileField без какого-либо файла?
10. Как выполнять операции объединения в django ORM?
11. Как найти вторую по величине запись с помощью Django ORM?
12. Найти строки с дублирующимися значениями полей
13. Как найти значения разных полей из набора запросов?
14. Как использовать объекты Q для сложных запросов?
15. Как группировать записи в Django ORM?
16. Как эффективно выбрать случайный объект из модели?
17. Как использовать произвольные функции базы данных в кверисетах?
Тестирование
1. Как убедитьтся, что функция использовала фиксированное количество
запросов?
2. Как ускорить тестирование путем повторного использования базы данных
между прогонами теста?
3. Как перезагрузить объект модели из базы данных?
Индексы и таблицы
Алфавитный указатель
Состав модуля
Поиск
Введение
В этой книге мы будем изучать Django ORM, делая с ним разные вещи. Мы
зададим около 50 вопросов о Django ORM и получим более глубокое
понимание ORM.
Если вам нужно глубже понять Django ORM и слой моделей, прочитайте эти
главы от начала и до конца.
1. Как найти запрос, связанный с набором запросов?
У вас есть модель под названием Event. Для получения всех записей вы
напишете что-то вроде Event.objects.all(), затем сделаете
str(queryset.query).
Пример 2
queryset_1 =User.objects.filter(first_name__startswith='R',last_name__startswith='D')
In [10]: str(queryset_2.query)
Out[10]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE
("auth_user"."first_name"::text LIKE R% AND "auth_user"."last_name"::text LIKE D%)'
queryset_1 =User.objects.filter(first_name__startswith='R',last_name__startswith='D')
SELECT id, username, first_name, last_name, email FROM auth_user WHERE NOT id < 5;
>>> q1 = User.objects.filter(id__gte=5)
>>> q1<QuerySet [<User: Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User:
Raghu>, <User: rishab>]
>>>> q2 = User.objects.filter(id__lte=9)
>>>> q2<QuerySet [<User: yash>, <User: John>, <User: Ricky>, <User: sharukh>, <User:
Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User: Raghu>]
>>> q3 = EventVillain.objects.all()
>>> q3<QuerySet [<EventVillain: EventVillain object (1)>]
>>>> q1.union(q3)
hero_qs = Hero.objects.filter(category=OuterRef("pk")).order_by("-benevolence_factor")
Category.objects.all().annotate(most_benevolent_hero=Subquery(hero_qs.values('name')[:1]))
SELECT "entities_category"."id","entities_category"."name",(SELECT
U0."name"FROM "entities_hero" U0WHERE U0."category_id" =
("entities_category"."id")ORDER BY U0."benevolence_factor" DESCLIMIT 1) AS
"most_benevolent_hero"FROM "entities_category"
hero_qs = Hero.objects.filter(category=OuterRef("pk")).order_by("
benevolence_factor")
Мы упорядочиваем объект Hero по benevolence_factor в порядке DESC и
используем category=OuterRef("pk"), чтобы объявить, что мы будем
использовать его в подзапросе.
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>
In [29]: User.objects.filter(last_name=F("first_name"))
Out[29]: <QuerySet [<User: Guido>]>
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>]>
no_files_objects = MyModel.objects.filter(Q(file='')|Q(file=None))
Оператор SQL Join используется для объединения данных или строк из двух
или более таблиц на основе общего поля между ними. Объединение может
быть выполнено различными способами. Некоторые из них показаны ниже.:
SELECT
"auth_user"."id","auth_user"."password","auth_user"."last_login","auth_user
"."is_superuser","auth_user"."username","auth_user"."first_name","auth_use
r"."last_name","auth_user"."email","auth_user"."is_staff","auth_user"."is_acti
ve","auth_user"."date_joined"FROM "auth_user"ORDER BY
"auth_user"."last_login" DESCLIMIT 1OFFSET 2
12. Найти строки с дублирующимися значениями полей
distinct =
User.objects.values('first_name').annotate(name_count=Count('first_name')).
filter(name_count=1)
SELECT
"auth_user"."id","auth_user"."password","auth_user"."last_login","auth_user
"."is_superuser","auth_user"."username","auth_user"."first_name","auth_use
r"."last_name","auth_user"."email","auth_user"."is_staff","auth_user"."is_acti
ve","auth_user"."date_joined"FROM "auth_user"WHERE
("auth_user"."first_name"::text LIKE R%AND NOT
("auth_user"."last_name"::text LIKE Z%))