Django: создание списка активных записей в блоге. Это эффективно? - PullRequest
1 голос
/ 20 января 2009

Следующий запрос выполняет то, что я хотел бы, однако я понятия не имею, насколько он эффективен. Я просмотрел документацию по Django , бросил ее вместе, посмотрел на запрос и наклонил голову, как сбитая с толку собака.

Что на самом деле делает запрос, так это публикует записи "name" и "name_slug", которые имеют один или несколько утвержденных комментариев, и упорядочивает результаты по полю последнего комментария "date_published". Результаты представляют собой список недавно активных записей.

Итак, несколько вопросов. (1) Есть ли что-то, что вы видите в запросе, это просто нет-нет. (2) Есть ли способ увидеть RAW SQL, который запрашивает базу данных?

Модель:

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')

Запрос:

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]

Ответы [ 2 ]

5 голосов
/ 20 января 2009

2) Да, если settings.DEBUG имеет значение true, необработанные SQL-запросы хранятся в django.db.connection.queries.

http://blog.michaeltrier.com/2007/8/11/display-the-sql-django-orm-is-generating

1 голос
/ 20 января 2009

Я сократил запрос до этого:

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]

Если он фильтрует по comment__approved='Y', тогда нет необходимости считать комментарии и фильтровать их снова с comments__gte=1.

Я посмотрю на django.db.connection.queries. Это выглядит просто. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...