開発環境
- Python 3.7.3
- Django 3.0.5
※Class-Basedで開発していきます。
一番簡単な書き方
views.py
from django.views.generic import ListView
from .models import SampleModel
class SampleListView(ListView):
model = SampleModel
def get_queryset(self):
return SampleModel.objects.order_by('?')[:5]
-
.order_by('?')
オブジェクトの並び順をランダムにする -
[:5]
配列の先頭から5番目まで([0]~[4])スライス
ちょっと長い書き方
views.py
from django.views.generic import ListView
from .models import SampleModel
import random
class SampleListView(ListView):
model = SampleModel
def get_queryset(self):
pks = SampleModel.objects.values_list('pk', flat=True)
pks_list = list(pks)
pks_random = random.sample(pks_list, 5)
queryset = SampleModel.objects.filter(pk__in=pks_random)
return queryset
-
.values_list('pk', flat=True)
各オブジェクトのpk値だけリストで取得 - ※
flat=True
を指定しないと、タプルのリスト "([ ], [ ], )" が返ってきます。 -
list(pks)
あくまでQuerySetのリストが生成されるので純粋なリストに変換 -
random.sample(pks_list, 5)
取得したpk値リストからランダムに5つ選択 -
.filter(pk__in=pks_random)
ランダムに選択した5つのpk値を持つオブジェクトを取得
最後に
以上の2つよりスマートな書き方があれば、コメントで教えてください。