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]