python - 随机化 Django 查询集一次,然后遍历它

标签 python django python-2.7

我正在编写一个应用程序,允许人们比较不同的主题标签对。

型号:

class Competitors(models.Model):
    tag1 = models.ForeignKey('Hashtag', related_name='+')
    tag2 = models.ForeignKey('Hashtag', related_name='+')
    votes = models.PositiveIntegerField(default=0, null=False)

查看:

def compare_hashes(request, i=None):
    i = i or 0
    try:
        competitors = Competitors.objects.order_by('?')[i]
    except IndexError:
        return render(request, 'hash_to_hash.html',
            {'tag1': '', 'tag2': '', i: 0, 'done': True})

    if request.method == 'POST':
        form = CompetitorForm(request.POST)
        if form.is_valid():
            if "yes" in request.POST:
                competitors.votes += 1
                competitors.save()
        i += 1
        return render(request, 'hash_to_hash.html',
                  {'tag1': competitors.tag1, 'tag2': competitors.tag2, i: i, 'done': False})

    else:
        return render(request, 'hash_to_hash.html',
                  {'tag1': competitors.tag1, 'tag2': competitors.tag2, i: i, 'done': False})

我想做的是,针对每个访问者,随机化 Competitors 对象的顺序,然后遍历该随机列表。

问题:

  1. 除了 objects.order_by('?') 之外,还有什么更好的随机化方法?我正在使用 MySQL,我在这里看到了一些关于 order_by('?') + MySQL = SLOOOOOOOW 的事情。给出了一些建议,我可以很容易地实现一些东西(我在想一些类似 random.shuffle(Competitors.objects.all()) 的东西),但我不确定我会把它放在哪里,这引出了我的第二个问题......
  2. 如何确保随机化只发生一次?我不想让人们一遍又一遍地查看相同的配对而让他们感到厌烦,我也不想让一些配对随机出现不止一次而放弃我的结果。我希望每个人都能看到相同的列表,只是顺序不同。

我怀疑答案在于 Manager 类,但实际上,这一切都归结为我对 Django 何时调用什么缺乏了解。

(我也遇到了一个问题,结果似乎没有保存到我的数据库中,但这是一个不同的问题,可能更容易解决。)

最佳答案

尝试了 Greg 在 PostgreSQL 上的回答并得到了一个错误,因为那里没有带种子的随机函数。思前想后,我另辟蹊径,把这份工作交给了Python,它更喜欢这样的任务:

def order_items_randomly(request, items):
    if not request.session.get('random_seed', False):
        request.session['random_seed'] = random.randint(1, 10000)
    seed = request.session['random_seed']
    random.seed(seed)
    items = list(items)
    random.shuffle(items)
    return items

在我的 1.5k 项查询集上运行速度足够快。

附言由于它将查询集转换为列表,因此最好在分页之前运行此函数。

关于python - 随机化 Django 查询集一次,然后遍历它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597709/

相关文章:

python - 使 Python 脚本与 xargs 一起工作

python-2.7 - 使用 boto3 将文件上传到 S3 中的特定文件夹

python - 如何将查询结果插入 BigQuery 前缀表

python - python 多进程发生了一些奇怪的事情

Python - 检查图是否已连接 - 意外的循环行为

python - 嵌入式 Python - 时间模块中的阻塞操作

django - Django模板中按日期错误的顺序

.net - 通过 HTTP POST 使用 HttpWebRequest 和 HttpWebResponse 从 .NET 进行 Django 身份验证

python - language_check 远程端关闭连接无响应问题

mysql - Unicode解码错误: 'utf8' codec can't decode byte