Я хочу запрашивать 3 случайных продукта из базы данных каждый раз только 3
y = (Product.objects.all()).count()
x = random.randint(3,y)
prouct1 = Product.objects.get(id = x+1)
prouct2 = Product.objects.get(id = x-1)
prouct3 = Product.objects.get(id = x-2)
Я хочу получать 3 случайных продукта каждый раз, когда я запускаю функцию Изначально я использую вышеуказанный метод Но проблема в том, что если я удаляю объект, то получаю ошибку Я не хочу, чтобы это происходило, очевидно, я могу выполнить больше проверок, но я чувствую, что есть какой-то простой способ сделать это Цель состоит в том, чтобы получать случайный объект из базы данных каждый раз, когда страница отображается
Вместо этого используйте OFFSET … LIMIT …:
qs = Product.objects.all() n = qs.count() x0, x1, x2 = random.sample(range(n), 3) product0 = qs[x0] product1 = qs[x1] product2 = qs[x2]
для этого необходимо, чтобы в таблице Product было как минимум три элемента, и будет сделано четыре запроса: один для подсчета и три для отдельных продуктов. Это также гарантирует, что три продукта различны.
Если таблица не очень большая, можно сделать выборку из списка первичных ключей, а затем получить три элемента:
pks = Product.objects.values_list('pk', flat=True)
product0, product1, product2 = Product.objects.filter(pk__in=random.sample(pks, 3))
В этом случае будет сделано два запроса: один для загрузки всех первичных ключей, а другой для получения трех продуктов в большом количестве. Это более расширяемый вариант, если количество продуктов, которые вы хотите получить, увеличится, так как для получения, например, десяти продуктов, все равно потребуется два запроса.
Просто вы можете получить случайный продукт, используя .order_by('?'):
ran_prod = Product.objects.all().order_by('?')[:3]