Cela semble étrange, mais c'est une idée très simple. J'essaye de faire un simple Flickr pour un site Web que je construis. Ce problème spécifique vient quand je veux montrer une seule photo (de mon modèle Photo
) sur la page mais je veux également montrer l'image avant elle dans le flux et l'image après elle.Obtenir des enregistrements avant et après la sélection en cours dans la requête Django
Si je ne faisais que trier ces flux par date, ou que je ne faisais que trier par ID, cela pourrait être plus simple ... Mais je ne le suis pas. Je veux permettre à l'utilisateur de trier et filtrer par toute une variété de méthodes. Le tri est simple. J'ai fait cela et j'ai un ensemble de résultats, contenant 0-many Photo
s.
Si je veux un seul Photo
, je commence avec ce flux filtré/trié/etc. De là, je dois obtenir le Photo
actuel, le Photo
avant et le Photo
après.
Voici ce que je regarde en ce moment.
prev = None
next = None
photo = None
for i in range(1, filtered_queryset.count()):
if filtered_queryset[i].pk = desired_pk:
if i>1: prev = filtered_queryset[i-1]
if i<filtered_queryset.count(): next = filtered_queryset[i+1]
photo = filtered_queryset[i]
break
Il semble juste disgracieusement désordonné. Et inefficace. Oh mon seigneur, si inefficace. Quelqu'un peut-il améliorer cela?
Les requêtes de Django sont tardives, donc ce serait bien d'en faire usage même si je suppose que cela pourrait être impossible étant donné mes horribles restrictions. Edit: il me vient à l'esprit que je peux juste jeter un peu de SQL pour re-filtrer le queryset. S'il y a un moyen de sélectionner quelque chose avec ses deux (ou un, ou zéro) voisins les plus proches avec SQL, j'aimerais bien le savoir!
On dirait que vous essayez de créer des index là où vous n'en avez pas. Si vous aviez un groupe de personnes et que vous en avez choisi un parmi la foule, vous avez dit: «Trouvez-moi la prochaine personne la plus grande et la plus proche par rapport à cette personne», sinon, comment le feriez-vous? –
"Ensuite, et seulement alors, puis-je voir si mon image est dans cette sélection" <- Pourriez-vous expliquer pourquoi c'est le cas? Vous n'avez pas l'identifiant de l'image dans l'URL? –
@Emil J'ai le pk de l'image voulue mais j'ai besoin de le localiser dans la liste (ce qui implique de le parcourir si dessus est la seule option). Je ne peux pas filtrer à nouveau (ou '.get()') parce que ça m'empêcherait d'obtenir prev/next Photos – Oli