7
votes

Django - Sélectionnez une photo aléatoire de chaque album

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: xxx pré>

J'ai essayé de nombreuses approches différentes sans succès. Est-ce un autre facile? P>

Prendre 2: code final: p>

galeries def (demande, template_name = 'Galleries.html'): P>

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,
})


1 commentaires

J'ai beaucoup appris de toutes ces réponses et a finalement utilisé une combinaison. Merci beaucoup: toutes les galeries def (demande, template_name = 'galleries.html'): albums = album.Object.select_related (). All () Album_list = [] pour l'album in albums: album_list.append ({'Titre': album.title, 'id': album.id, 'photo': album.random_photo ()}) retour rendu_to_reesponse (template_name, {"album_list": album_list,})


4 Réponses :


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

4 commentaires

oooh, compréhension de la liste, sympa!


pour l'album en album.Object.all ()


Essayé ceci: >>> Importer aléatoire >>> Randomphotos = [aléatoire.choice (album.photos.object.All ()) pour l'album en album.Object.All ()] et a gagné ceci: Traceback (dernier appel en dernier) : Fichier "", ligne 1, dans? AttributeError: "MestrelatedManager" L'objet n'a aucun attribut 'Objets' >>>


Supprimer les objets Word d'album.photos.ObjectS.all ()



8
votes

Je n'ai pas testé le code, mais c'est la bonne idée, et le Select_Related devrait vous aider à subir trop de plusieurs requêtes de 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


2 commentaires

Besoin de faire quelque chose de légèrement différent au milieu car il est en supposant que des photos ont toutes des clés primaires comprises entre 0 et total. Puis-je obtenir un élément aléatoire d'une liste de tous les albums.photos?


elpenia.wordpress.com / 2010/05 / 11 / ...



3
votes

Si vous créez une méthode personnalisée dans votre modèle d'album, cela ressemble à quelque chose comme ceci:

albumObj.random_photo()


0 commentaires

24
votes

Vous pouvez obtenir un seul objet aléatoire à partir de n'importe quel querySet à l'aide de la méthode Order_by avec une marque d'interrogation comme argument. Cela peut être mieux que d'appeler photo.Object.All () car il ne renvoie qu'un objet photo par requête de la base de données, plutôt que dans l'ensemble de l'ensemble, puis en utilisant Python pour filtrer la liste.

Par exemple, cette requête sera renvoyer une seule photo aléatoire:

photo.Object.ordorder_by ('?') [: 1]

Ce qui suit n'est pas optimal, car il a besoin de 1 requête pour chaque album, mais cela fonctionnerait: xxx

edit: Modifié le [0] index sur [: 1] car celui-ci soulever une indexerror si l'albumn ne contient aucune photo.

Alternativement, dans la liste Syntaxe de compréhension: xxx


4 commentaires

+1: On dirait que c'est un bon moyen de le faire, et si je pouvais, je pourrais vous donner un autre +1 pour m'apprécier quelque chose à propos de ecrand_by que je ne savais pas! Merci!


S'il vous plaît voir buffis.com/2008/01/20/...


Lisez votre blog post chefsmart. Que se passe-t-il dans votre exemple si l'un des enregistrements est supprimé, ou pour une autre raison, l'ensemble des identifiants n'est pas un ensemble séquentiel contigu en commençant par 1?


Si vous utilisez un cache de base de données (comme Johnny cache), la commande_by ('?') Devient presque inutile pour les tables éditées rarement.