Как импортировать случайную модель из БД в 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

Что это делает:

  1. Найдите наибольший ID ряда (предполагается, что ID является суррогатным автоинкрементным целым числом)
  2. Получите случайное число между 1 и ID наибольшей строки
  3. Попробуйте выбрать ряд с этим ID

Цикл необходим, если у вас есть дыры в нумерации, например, если вы удалили ряд.

Для получения более подробной информации смотрите этот пост.

Вернуться на верх