Hand с полем FK на Person,
есть Finger с FK на Hand.
Надо выбрать всех Person, Hand и Finger. Ок, это не сложно.
qs = models.Person.objects.prefetch_realted('hand_set', 'hand_set__finger_set')
Но проблема в том, что второй prefetch очень долгий. Почти две секунды питон проводит в django.db.models.query.prefetch_one_level, при этом на сам запрос - ну типа 30-40ms.
Объектов Person примерно 500-700, Hand и Finger - по паре тысяч каждых. По отдельности`list(models.Hand.all()) и list(models.Finger.all()) быстро выполняются.
Добавление Prefetch объектов не сильно решают проблему.
Кто-нибудь сталкивался с таким?
может, поля дергать только те, что реально необходимы?
Это всё потом в drf уедет в трёхуровневую структуру, там нет ненужных полей. Да и выборка/конструирование объектов быстро проходит. Очень долго джанга результаты выборки prefetch-запросов прибивает к объектам.
а чё, реально нужно отдать без пагинации все 500-700 штук? джанга по умолчанию по 100 запрашивает
угу, нужно все 500
Может попробовать панду подключить?
Панда вроде бы готовый кверисет; мне это не сильно поможет,потому что к этому моменту prefetch_related уже отработал и оттормозил :)
Пандай можно будет достать нужные таблицы и отфильтровать, потом в json преобразуешь, панда очень быстро работает, просто оправдано ли будет ее сюда тащить
не, ради одной вьюшки - точно не стоит.
Обсуждают сегодня