Как получить один случайный элемент из базы данных в Django / postgreSQL? - PullRequest
7 голосов
/ 20 февраля 2012

Итак, я получил database.objects.all () и database.objects.get ('name'), но как мне получить один случайный элемент из базы данных. У меня проблемы с попыткой выяснить, как это сделать, или выбрать один случайный предмет.

Ответы [ 3 ]

17 голосов
/ 20 февраля 2012

Выбор случайного элемента из списка всех объектов базы данных не является решением goog, поскольку извлечение всех элементов базы данных может сильно повлиять на производительность, равно как и использование order_by('?'), как упомянуто в документации django.

Лучшим решением должно быть получение элемента со случайным индексом:

import random

random_idx = random.randint(0, Model.objects.count() - 1)
random_obj = Model.objects.all()[random_idx]
2 голосов
/ 20 февраля 2012

Решение Аамира выберет все объекты перед тем, как отбросить все, кроме одного. Это чрезвычайно расточительно, и, кроме того, такие вычисления должны выполняться в базе данных.

model.objects.all().order_by('?')[0]

Подробнее здесь: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

Редактировать : ответ lazerscience действительно быстрее, как показано здесь .

0 голосов
/ 12 января 2014

Я бы сделал это немного по-другому.Querysets ленивы в любом случае в Django.

import random

def get_my_random_object():
    object = random.choice(model.objects.all())
    return object

https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...