문제

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 갤러리 (요청, 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,
})
도움이 되었습니까?

해결책

나는 코드를 테스트하지 않았지만 이것은 올바른 아이디어이며 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

다른 팁

쿼리 세트에서 order_by 논문으로 물음표가있는 방법. 이것은 전체 세트가 아닌 데이터베이스에서 쿼리 당 하나의 사진 객체 만 반환 한 다음 Python을 사용하여 목록을 필터링하기 때문에 photo.objects.all ()을 호출하는 것보다 낫습니다.

예를 들어이 쿼리는 단일 임의의 사진을 반환합니다.

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

각 앨범마다 1 개의 쿼리가 필요하기 때문에 다음은 최적이 아니지만 작동합니다.

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

편집하다:변경 [0] 인덱스로 [:1] 알부민에 사진이 포함되어 있지 않으면 전자는 인덱스 오버를 올릴 것이기 때문입니다.

또는 목록 이해 구문 :

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]

앨범 모델에서 사용자 정의 메소드를 만드는 경우 다음과 같은 것 같습니다.

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

현재 앨범 인스턴스에서 임의의 사진을 반환합니다.

albumObj.random_photo()

참고 : 테스트되지 않은 코드

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top