7

syncrによって作成されたデータから各アルバムからランダムな写真を取得しようとしています。モデル(省略形)は次のようになります。


class Album(models.Model):
    title = models.CharField(max_length=200)
    photos = models.ManyToManyField('Photo')

class Photo(models.Model):
    title = models.CharField(max_length=200)

私は多くの異なるアプローチを試しましたが、成功しませんでした。これは別の簡単なものですか?

テイク2:最終コード:

def galleries(request、template_name ='galleries.html'):

albums = Album.objects.select_related().all()
album_list = []
for album in albums:
   album_list.append({'title':album.title, 'id':album.id, 'photo':album.random_photo()})

return render_to_response(template_name, {
     "album_list": album_list,
})
4

4 に答える 4

24

order_by疑問符を引数として持つメソッドを使用して、任意のクエリセットから単一のランダムオブジェクトを取得できます。これは、Photo.objects.all()を呼び出すよりも優れている場合があります。これは、セット全体ではなく、データベースからのクエリごとに1つの写真オブジェクトのみを返し、Pythonを使用してリストをフィルタリングするためです。

たとえば、このクエリは1枚のランダムな写真を返します。

Photo.objects.order_by('?')[:1]

以下は、アルバムごとに1つのクエリが必要なため、最適ではありませんが、機能します。

photos = []
for a in Album.objects.all():
    photo = a.photos.order_by('?')[:1]
    photos.append(photo)

編集:アルバムに写真が含まれていない場合、前者はIndexErrorを発生させるため、[0]インデックスをに 変更しました。[:1]

または、リスト内包表記の構文:

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
于 2009-07-16T18:00:01.980 に答える
8

私はコードをテストしていませんが、これは正しい考えであり、select_relatedは非常に多くのdbクエリが発生するのを防ぐのに役立つはずです...

from models import Album, Photo
import random

def get_random():
    albums = Album.objects.select_related().all()
    randpics = []
    for album in albums:
        total = album.photos.count()
        photo = album.photos.get(pk=random.randrange(0,total))
        randpics.append(photo)
    return randpics
于 2009-07-16T17:39:54.373 に答える
4
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]
于 2009-07-16T17:37:00.230 に答える
3

アルバムモデルでカスタムメソッドを作成すると、次のようになります。

def random_photo(self):
    import random
    return random.choice(self.photos.all())

これにより、現在のアルバムインスタンスからランダムな写真が返されます。

albumObj.random_photo()

注:テストされていないコード

于 2009-07-16T17:42:40.687 に答える