2010-08-06 2 views
2

Supposons que j'ai ces deux modèles:Django: Obtenez tous les blogs et leurs dernières entrées de blog

class Blog(models.Model): 
    name = models.CharField(max_length=64) 
    # ... 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    added = models.DateTimeField(auto_now_add=True) 
    # ... 

Maintenant, je veux obtenir une liste de tous les blogs ainsi que la dernière entrée de blog pour chaque blog respectif. Quelle est la meilleure façon de le faire?

Si cela fait une différence, nous pouvons supposer que chaque blog a au moins une entrée.

Répondre

0

Il existe un moyen détourné (et très hackish) de le faire. Si cela ne vous dérange pas de normalisation, vous pouvez ajouter un champ optionnel latest_entry à votre modèle Blog. Vous pouvez ensuite remplacer Entry.save() pour mettre à jour ce champ pour l'instance Blog correspondante chaque fois qu'une instance Entry est créée. Alternativement, vous pouvez ajouter un signal pour le faire.

def save(self, *args, **kwargs): 
    if not self.pk: #This object is being created, not updated. 
     self.blog.latest_entry = self   
    models.Model.save(self, *args, **kwargs) 

Oui, ce n'est pas propre. Mais cela réduira le nombre de requêtes. Ensuite, vous pouvez faire:

[(blog, blog.latest_entry) for blog in Blog.objects.all()] 
0

Vous pouvez utiliser la dernière() méthode du gestionnaire connexe:

blogs = Blog.objects.all() 

a_blog = blogs[0] 
latest_entry = a_blog.entry_set.latest() 

# or... 
latest_entries = [blog.entry_set.latest() for blog in blogs] 

Quelque chose comme ça.

+0

Ce serait le moyen idéal de le faire, mais malheureusement (si je ne me trompe sérieusement) cela générerait plus de requêtes que il y a des blogs (un pour obtenir la dernière entrée pour chaque blog). Je pensais qu'il y avait peut-être un moyen plus intelligent, mais je commence à croire qu'il n'y en a pas. –

+0

Ici 4 ans plus tard, je commence à être d'accord avec vous @DenizDogan – boatcoder

Questions connexes