Django - Выберите случайную фотографию из каждого Альбома

Вот очень короткий способ сделать это

function arrEquals(arr1, arr2){
     return arr1.length == arr2.length && 
     arr1.filter(elt=>arr1.filter(e=>e===elt).length == arr2.filter(e=>e===elt).length).length == arr1.length
}
7
задан PhoebeB 16 July 2009 в 18:39
поделиться

4 ответа

Я не тестировал код, но это правильная идея, и select_related должен помочь вам избежать слишком большого количества запросов к базе данных ...

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
8
ответ дан 6 December 2019 в 05:06
поделиться

You can get a single random object from any Queryset using the order_by method with a question mark as an argument. This may be better than calling Photo.objects.all() because it will only return one photo object per query from the database, rather than the whole set and then using python to filter the list.

For instance, this query will return a single random photo:

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

The following is not optimal, because it needs 1 query for each album, but it would work:

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

Edit: Индекс [0] изменен на [: 1] , потому что первый вызовет IndexError, если в альбоме нет фотографий.

В качестве альтернативы в синтаксисе понимания списка:

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
24
ответ дан 6 December 2019 в 05:06
поделиться
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]
4
ответ дан 6 December 2019 в 05:06
поделиться

Если вы создадите собственный метод в своей модели альбома, он будет выглядеть примерно так:

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

Это вернет случайную фотографию из текущего экземпляра альбома, то есть

albumObj.random_photo()

Примечание: непроверенный код

3
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: