2009-09-04 4 views
0

Je ne suis même pas sûr d'avoir correctement répondu à la question. Voici la situation. J'ai un jeu de requêtes généré en accédant à la relation de clé étrangère. En utilisant les modèles standard Blog/Entrée dans la documentation de Django, disons que j'ai choisi un blog et maintenant un ensemble d'entrées:Interroger un queryset Django sans créer un nouveau jeu de requête?

entries = Blog.objects.get(id=1).entry_set.all() 

Nous avons donc des entrées pour le blog, peut-être zéro. Je voudrais alors dire construire un calendrier et indiquer quels jours ont des entrées de blog. Donc, ma pensée est d'itérer sur la liste des jours dans le mois ou quoi que ce soit, et vérifier les entrées queryset pour une entrée avec cette date. La question est, quelle est la meilleure façon de faire cela? Ma première pensée était de faire quelque chose comme

dayinfo = [] # we will iterate over this in the template 
for curday in month: 
    dayinfo.append({'day':curday, 'entry':entries.filter(day=curday)}) 

Le problème est que l'appel de filtre retourne une nouvelle queryset, et qui génère un nouvel appel SQL pour chaque itération de la boucle. J'ai juste besoin d'arracher l'objet d'entrée des entrées s'il existe et de le coller dans mon calendrier. Alors, quelle est la meilleure façon de faire cela? Je l'ai fait fonctionner:

dayinfo.append({'day':day, 'entry':[e for e in entries if e.day == curday][0]}) 

Cela ne génère pas de nouveaux appels SQL. Mais c'est sûr que c'est moche.

Répondre

2

Résistez à l'envie de tout mettre sur une ligne - je pense que le code serait plus propre avec quelque chose comme ceci:

from collections import defaultdict 
calendar = defaultdict(list) 

for entry in entries: 
    calendar[entry.day].append(entry) 

La partie defaultdict est simple, mais vous voudrez peut-être pour l'initialiser avec tous les jours dans un mois si vous envisagez d'utiliser une boucle for dans le modèle. Notez également que si vous utilisez Django 1.1, vous pouvez utiliser la nouvelle méthode annotate() pour calculer simplement le nombre de post si vous ne prévoyez pas réellement de générer des liens vers des publications individuelles.

+0

Merci, c'était ce dont j'avais besoin. Il s'agissait plus d'un problème de codage générique que d'un problème de Django. Je savais qu'il y avait une façon plus simple de faire ce que j'essayais de faire! – chacmool

Questions connexes