You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何从数据库随机获取一条模型记录

解决方案

你原有代码的错误点:

  • 未导入random模块,直接调用会触发名称错误
  • random.choice()仅支持传入可迭代序列,无法直接接收模型类Words作为参数
  • 构造模板上下文时错将字典写为集合(键值间误用逗号而非冒号),会导致模板无法读取对应变量

推荐方案(适配Wordle词库规模)

Wordle使用的5字母词库仅数千个单词,直接使用Django ORM原生的随机排序语法即可,代码简洁且性能够用:

from django.shortcuts import render
from .models import Words

def home(request):
    # 从数据表随机取1条单词记录
    word_record = Words.objects.order_by('?').first()
    # 上下文固定为字典格式,键值用冒号分隔
    context = {'word': word_record.word if word_record else ''}
    return render(request, 'home.html', context)

提示:如果还未向Words表导入单词数据,first()会返回空值,上述代码加了空值判断避免报错,导入词库后即可正常返回随机单词。

大词库优化方案

如果你的词库规模达到十万级以上,order_by('?')会产生全表排序的性能损耗,可以用随机ID的方式实现,性能更高:

from django.shortcuts import render
from django.db.models import Max
from .models import Words
import random

def home(request):
    max_id = Words.objects.aggregate(max_id=Max('id'))['max_id']
    word_record = None
    if max_id:
        # 循环兜底,避免主键ID断层导致取不到记录
        while not word_record:
            random_id = random.randint(1, max_id)
            word_record = Words.objects.filter(id=random_id).first()
    context = {'word': word_record.word if word_record else ''}
    return render(request, 'home.html', context)

内容的提问来源于stack exchange,提问作者Blake McFarlane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:57:13