我正在编写一个应用程序,允许人们比较不同的主题标签对。
模型:
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})
我想要做的是,每个访问者随机化竞争对手对象的顺序,然后遍历该随机列表。
问题:
- 除了 o 之外,还有什么更好的随机化方法
bjects.order_by('?')
?我正在使用 MySQL,我在这里看到了一些关于如何order_by('?')
+ MySQL = SLOOOOOOOW 的内容。给出了一些建议,我可以很容易地实现一些东西(我在想一些类似的东西random.shuffle(Competitors.objects.all())
),但我不确定我会把它放在哪里,这导致我的第二个问题...... - 如何确保随机化只发生一次?我不想让人们一遍又一遍地查看相同的配对而让他们感到厌烦,我不想让一些配对随机出现不止一次来影响我的结果。我希望每个人都看到相同的列表,只是顺序不同。
我怀疑答案在于 Manager 类,但实际上,这一切都归结为我对 Django 何时调用的内容缺乏了解。
(我也有一个问题,结果似乎没有保存到我的数据库中,但这是一个不同的,可能更容易解决的问题。)