Нашли опечатку?

Выделите её мышкой и нажмите Enter

Ctrl-Enter
Выполнено:
87 1 199 25
на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!

ЯМ:41001223475816

Редактор ресурсов Gettext для Android
Всего пользователей: 1147
Русская группа
на Google

Документация Django на русском

Документация на русском языке для Django стала реальностью. Благодаря новым возможностям движка Sphinx мы можем оперативно дополнять перевод, по мере обновления оригинальной документации.

Нужна помощь дизайнера

Хотим добавить ачивки на сайте. Они уже как бы есть, но нет красивых иконок для отображения в профиле и на сайте. Если кто может быстренько и без напряга сделать с десяток, мы были бы благодарны. Обсуждение на форуме.

<<< Вернуться

ORM: Выборка в случайном порядке

17 января 2013 г. 21:28:12

Когда возникает задача отобразить на сайте случайные шесть элементов из модели я делаю так: * Выборка списка нужных полей из модели. * Перемешиваю. * Беру первые шесть.

рейтинг: 0

sliced_random.py

import random
LIMIT=6
def view(request):
    tuple_list = list(Model.objects.values_list('pk', 'title'))
    random.shuffle(tuple_list)
    context = dict(tuple_list[:LIMIT]
    ...
alerion
alerion 1 неделя прошло
Ответ | Ссылка

Если объекты нужны, можно просто pk выбрать и потом сделать filter(pk__in=tuple_list)

rad
rad 1 неделя прошло
Ответ | Ссылка

Тоже вариант, но я сразу выбираю значения одним селектом и уже на уровне питона перемешиваю их.

alerion
alerion 1 неделя прошло
Ответ | Ссылка

Ответ на rad
Тоже вариант, но я сразу выбираю значения одним селектом и уже на уровне питона перемешиваю их.

Объекты готовые выбираешь? Если много объектов, то лучше сначала просто id выбрать, т.к. можно нехило памяти отожрать.

wildhind
wildhind 6 дней, 14 часов прошло
Ответ | Ссылка

Почему-то мне это кажется странным.
Базы данных умеют так: select * from `table` order by rand();
Неужели ORM не в состоянии этим воспользоваться?

alerion
alerion 5 дней, 22 часа прошло
Ответ | Ссылка

Ответ на wildhind
Почему-то мне это кажется странным.
Базы данных умеют так: select * from `table` order by rand();
Неужели ORM не в состоянии этим воспользоваться?

А вы читали как это работает?

wildhind
wildhind 3 дня, 17 часов прошло
Ответ | Ссылка

Как работает что? Речь о производительности конструкции order by rand()?
Ну есть же и всякие решения вроде select ceil(rand() * (select max(id) from table)).
Или и вовсе можно за два запроса — примитивно, но надёжно. Выбрать max(id), внутри ORM вычислить случайное число в этих пределах, и уже сделать запрос конкретных записей.
Неужели .order_by('?') не обрабатывает такие ситуации?
Кстати, как можно посмотреть, какие запросы Джанго шлёт в БД?
Простите за глупые пионерские вопросы, лишь учусь пока.

alerion
alerion 3 дня, 17 часов прошло
Ответ | Ссылка

Ответ на wildhind
Как работает что? Речь о производительности конструкции order by rand()?
Ну есть же и всякие решения вроде select ceil(rand() * (select max(id) from table)).
Или и вовсе можно за два запроса — примитивно, но надёжно. Выбрать max(id), внутри ORM вычислить случайное число в этих пределах, и уже сделать запрос конкретных записей.
Неужели .order_by('?') не обрабатывает такие ситуации?
Кстати, как можно посмотреть, какие запросы Джанго шлёт в БД?
Простите за глупые пионерские вопросы, лишь учусь пока.

> Простите за глупые пионерские вопросы, лишь учусь пока.

django-debug-toolbar

> Неужели .order_by('?') не обрабатывает такие ситуации?

обрабатывает, одним запросом, написано в доке что может положить БД. И правильно делают. Это дело каждого как такие неоднозначные операции решать. Ваш вариант такой же как и у нас, только на SQL, а не Python.