Выделите её мышкой и нажмите Enter
| на поддержку перевода |
|
|
ЯМ:41001223475816
Документация на русском языке для Django стала реальностью. Благодаря новым возможностям движка Sphinx мы можем оперативно дополнять перевод, по мере обновления оригинальной документации.
Хотим добавить ачивки на сайте. Они уже как бы есть, но нет красивых иконок для отображения в профиле и на сайте. Если кто может быстренько и без напряга сделать с десяток, мы были бы благодарны. Обсуждение на форуме.
Когда возникает задача отобразить на сайте случайные шесть элементов из модели я делаю так: * Выборка списка нужных полей из модели. * Перемешиваю. * Беру первые шесть.
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]
...
Пожалуйста, дайте нам знать, если что-то не работает.
Если объекты нужны, можно просто pk выбрать и потом сделать filter(pk__in=tuple_list)
Тоже вариант, но я сразу выбираю значения одним селектом и уже на уровне питона перемешиваю их.
Ответ на rad
Тоже вариант, но я сразу выбираю значения одним селектом и уже на уровне питона перемешиваю их.
Объекты готовые выбираешь? Если много объектов, то лучше сначала просто id выбрать, т.к. можно нехило памяти отожрать.
Почему-то мне это кажется странным.
Базы данных умеют так: select * from `table` order by rand();
Неужели ORM не в состоянии этим воспользоваться?
Ответ на wildhind
Почему-то мне это кажется странным.
Базы данных умеют так: select * from `table` order by rand();
Неужели ORM не в состоянии этим воспользоваться?
А вы читали как это работает?
Как работает что? Речь о производительности конструкции order by rand()?
Ну есть же и всякие решения вроде select ceil(rand() * (select max(id) from table)).
Или и вовсе можно за два запроса — примитивно, но надёжно. Выбрать max(id), внутри ORM вычислить случайное число в этих пределах, и уже сделать запрос конкретных записей.
Неужели .order_by('?') не обрабатывает такие ситуации?
Кстати, как можно посмотреть, какие запросы Джанго шлёт в БД?
Простите за глупые пионерские вопросы, лишь учусь пока.
Ответ на wildhind
Как работает что? Речь о производительности конструкции order by rand()?
Ну есть же и всякие решения вроде select ceil(rand() * (select max(id) from table)).
Или и вовсе можно за два запроса — примитивно, но надёжно. Выбрать max(id), внутри ORM вычислить случайное число в этих пределах, и уже сделать запрос конкретных записей.
Неужели .order_by('?') не обрабатывает такие ситуации?
Кстати, как можно посмотреть, какие запросы Джанго шлёт в БД?
Простите за глупые пионерские вопросы, лишь учусь пока.
> Простите за глупые пионерские вопросы, лишь учусь пока.
django-debug-toolbar
> Неужели .order_by('?') не обрабатывает такие ситуации?
обрабатывает, одним запросом, написано в доке что может положить БД. И правильно делают. Это дело каждого как такие неоднозначные операции решать. Ваш вариант такой же как и у нас, только на SQL, а не Python.