2009-01-20 7 views
1

La requête suivante fait ce que je voudrais qu'il fasse, cependant, je n'ai aucune idée si c'est efficace. Je suis allé à travers la documentation Django aggregation, jeté ensemble, regardé la requête et incliné la tête de côté comme un chien confus.Django: Génération de la liste des entrées actives d'un blog. Est-ce efficace?

En fait, la requête obtient le nom "name" et "name_slug" d'Entry qui ont un ou plusieurs commentaires approuvés et ordonne les résultats par le champ "date_published" du dernier commentaire. Les résultats sont une liste des entrées récemment actives.

Alors quelques questions. (1) Y at-il quelque chose que vous voyez dans la requête qui est juste un non-non. (2) Existe-t-il un moyen de voir le SQL RAW qui interroge la base de données?

Modèles:

class Entry(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    name_slug = models.SlugField(max_length=200, blank=True, editable=False, unique=True) 
    date_published = models.DateTimeField() 
    is_published = models.BooleanField(default=False) 

class Comment(models.Model): 
    entry = models.ForeignKey('Entry') 
    date_published = models.DateTimeField() 
    approved_choices = (('N', 'No'), ('Y', 'Yes'), ('M', 'Needs Moderation'),) 
    approved = models.CharField(max_length=1, choices=approved_choices, default='N') 

Requête:

active_entry_list = Entry.objects 
    .values('name', 'name_slug') 
    .filter(is_published=True, comment__approved='Y') 
    .annotate(latest_comment=Max('comment__date_published'),comments=Count('comment')) 
    .filter(comments__gte=1) 
    .order_by('-latest_comment') 
    [:6] 

Répondre

1

J'ai réduit la requête à ceci:

active_entry_list = Entry.objects 
    .values('name', 'name_slug') 
    .filter(is_published=True, comment__approved='Y') 
    .annotate(latest_comment=Max('comment__date_published')) 
    .order_by('-latest_comment') 
    [:6] 

Si elle est le filtrage pour comment__approved='Y' alors il n'y a pas besoin de compter les commentaires et les filtrer à nouveau avec comments__gte=1.

Je vais regarder dans django.db.connection.queries. Cela semble simple. Merci!

Questions connexes