1. ホーム
  2. python

[解決済み] Django の ORM を使ってランダムなレコードを引き出すには?

2022-04-14 10:05:40

質問

私のサイトで紹介する絵画を表現したモデルがあります。メインページでは、そのうちのいくつかを表示したいと思います:最新のもの、最も長い間訪問されていないもの、最も人気のあるもの、そしてランダムなものです。

Django 1.0.2を使っています。

最初の3つはdjangoのモデルを使って簡単に引っ張ることができますが、最後の1つ(ランダム)は少し問題があります。もちろん、私のビューでこのようなコードにすることは可能です。

number_of_records = models.Painting.objects.count()
random_index = int(random.random()*number_of_records)+1
random_paint = models.Painting.get(pk = random_index)

これは完全にデータベースの抽象化の一部であり、モデルの中にあるべきものです。また、ここでは削除されたレコードの面倒を見る必要があります(そうすると、すべてのレコードの数は、可能なすべてのキー値をカバーしません)、そしておそらく他の多くのことがあります。

できればモデル抽象化の内部でどうにかしたいのですが、他に方法はありますか?

どのように解決するのですか?

使用方法 order_by('?') は、運用を始めて2日目にはデータベースサーバーを停止してしまいます。よりよい方法は、次のようなものです。 リレーショナルデータベースからランダムな行を取得する .

from django.db.models.aggregates import Count
from random import randint

class PaintingManager(models.Manager):
    def random(self):
        count = self.aggregate(count=Count('id'))['count']
        random_index = randint(0, count - 1)
        return self.all()[random_index]