Gasoid
@Gasoid

Как улучшить данный запрос в джанге?

надо получить следующий и предыдущий объект в запросе, отсортирован по текстовому полю ?
id_list = list(Product.objects.values_list('id', flat=True).order_by('title'))
next_id = id_list[id_list.index(cur_obj.id)+1]
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
Как вариант так (взял для примера свою модель, просто поменяв названия под ваши):
In [1]: Product.objects.values_list('id', flat=True).order_by('title')
Out[1]: [6, 7, 2, 15, 5, 4, 12, 14, 16, 1, 13, 10, 8, 11, 9, 3]

In [2]: my_pk = 12

In [3]: Product.objects.raw('SELECT * FROM product WHERE title<(SELECT title FROM product WHERE id=%s) ORDER BY title DESC LIMIT 1',[my_pk])[0].pk
Out[3]: 4

In [4]: Product.objects.raw('SELECT * FROM product WHERE title>(SELECT title FROM product WHERE id=%s) ORDER BY title ASC LIMIT 1',[my_pk])[0].pk
Out[4]: 14
Ответ написан
id_list = list(Product.objects.values_list('id', flat=True).order_by('title'))
current_pos = id_list.index(cur_obj.id)
next_and_prev = list(Product.objects.all().order_by('title')[current_pos-1:current_pos+2])

Не особенная оптимизация, с 3 запросов до 2.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы