2009-07-16 4 views
7

J'essaie d'obtenir une photo aléatoire de chaque album à partir des données créées par syncr. Le modèle (abrégé) ressemble à ceci:Django - Sélectionnez une photo aléatoire de chaque album


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

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

J'ai essayé beaucoup d'approches différentes sans succès. Est-ce un autre facile?

Take 2: Code final:

galeries def (demande, 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, 
}) 
+0

ont beaucoup appris de toutes ces réponses et éventuellement utilisé une combinaison. Merci beaucoup tous: galeries def (demande, template_name = 'galleries.html'): albums = Album.objects.select_related() tous() album_list = [] pour l'album en album:. album_list. append ({ 'title': album.title, 'id': album.id, 'photo': album.random_photo()}) render_to_response retour (template_name, { "album_list": album_list, }) – PhoebeB

Répondre

8

Je ne l'ai pas testé le code, mais c'est la bonne idée, et le select_related devrait vous aider de contracter tooooo nombreuses requêtes 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 
+0

Vous devez faire quelque chose de légèrement différent au milieu, car les photos doivent toutes avoir des clés primaires comprises entre 0 et le total. Puis-je avoir un élément aléatoire dans une liste de tous les albums.photos? +1: – PhoebeB

+0

http://elpenia.wordpress.com/2010/05/11/getting-random-objects-from-a-queryset-in-django/ – andrewrk

4
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()] 
+0

oooh , compréhension de la liste, sympa! –

+0

pour l'album dans Album.objects.all() –

+0

Essayé ceci: >>> import aléatoire >>> randomPhotos = [random.choice (album.photos.objects.tous()) pour l'album en Album.objects.all()] et a obtenu ceci: retraçage (appel le plus récent en dernier): Fichier "", ligne 1, en? AttributeError: l'objet 'ManyRelatedManager' n'a pas d'attribut 'objects' >>> – PhoebeB

3

Si vous faites une méthode personnalisée dans votre modèle de l'album, qui ressemble à ceci:

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

qui renverra une photo aléatoire de l'instance actuelle Album-à-dire

albumObj.random_photo() 

Note: code non testé

24

Vous pouvez obtenir un objet aléatoire à partir de n'importe quel Queryset utilisant la méthode order_by avec un point d'interrogation en tant qu'argument. Cela peut être préférable à l'appel de Photo.objects.all() car il renvoie uniquement un objet photo par requête de la base de données, plutôt que le jeu entier, puis utilise python pour filtrer la liste.

Par exemple, cette requête renvoie une seule photo au hasard:

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

Ce qui suit est pas optimale, car il a besoin 1 requête pour chaque album, mais il travaillerait:

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

Modifier: A changé l'index [0] en [:1] parce que le premier va déclencher une erreur d'Index si l'album ne contient pas Photos.

Alternativement, dans la liste syntaxe de compréhension:

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

+1: ressemble à ceci est un bon moyen de le faire, et si Je pourrais vous donner un autre +1 pour m'avoir appris quelque chose sur order_by je ne savais pas! Merci! – SingleNegationElimination

+0

+1 pour le order_by savoir aussi bien. – Harold

+0

s'il vous plaît voir http://buffis.com/2008/01/20/how-to-get-random-rows-from-mysql-using-django/comment-page-1/ – chefsmart

Questions connexes