Как импортировать случайную модель из БД в Django
Я пытаюсь освоить Django и при этом пытаюсь воссоздать популярную игру Wordle. Для начала я создал модель под названием 'Words', которая содержит слова из 5 букв. Я пытаюсь сгенерировать одно из этих случайных слов в моем файле views.py, где пользователь может попытаться угадать слово. Это мой первый раз, когда я задаю вопрос в stack overflow, поэтому я постараюсь отобразить то, что у меня есть на данный момент, как можно лучше.
В настоящее время в моем:
Views.py
from django.shortcuts import render
from .models import Words
def home(request):
word = random.choice(Words)
context = {'word', word}
return render(request,'home.html', context)
----- Я понимаю, что word = random.choice(Words)
это невозможно, Какой лучший способ сделать это?
Models.py
from django.db import models
class Words(models.Model):
word = models.CharField(max_length=5)
def __str__(self):
return self.word
Прямой, но неоптимальный способ был бы следующим:
Words.objects.order_by("?").first()
Эта операция может быть тяжелой, если у вас много строк в таблице DB, так как она выполняет ORDER BY
на всей таблице без использования какого-либо индекса.
Лучший способ выбора случайной модели выглядит следующим образом:
def get_random_word():
max_id = Word.objects.all().aggregate(max_id=Max('pk'))['max_id']
while True:
pk = random.randint(1, max_id)
word = Word.objects.filter(pk=pk).first()
if word:
return word
Что это делает:
- Найдите наибольший ID ряда (предполагается, что ID является суррогатным автоинкрементным целым числом)
- Получите случайное число между 1 и ID наибольшей строки
- Попробуйте выбрать ряд с этим ID
Цикл необходим, если у вас есть дыры в нумерации, например, если вы удалили ряд.
Для получения более подробной информации смотрите этот пост.