さまざまなハッシュタグのペアを比較できるアプリを書いています。
モデル:
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())
) が、それをどこに置くかわかりません。それが私の 2 番目の質問につながります... - ランダム化が 1 回だけ行われるようにするにはどうすればよいですか? 同じペアを何度もレビューさせて人々を退屈させたくありません。また、いくつかのペアをランダムに複数回表示して結果を台無しにしたくありません。順序を変えて、同じリストをみんなに見てもらいたいです。
答えは Manager クラスにあるのではないかと思いますが、実際には、これはすべて、Django がいつ何を呼び出すかについての知識が不足していることが原因です。
(結果がデータベースに保存されていないように見える問題もありますが、それは別の、おそらくより簡単に解決できる問題です。)