Django:生成博客的活动条目列表。这有效率吗?

Posted

技术标签:

【中文标题】Django:生成博客的活动条目列表。这有效率吗?【英文标题】:Django: Generating a blog's active entry list. Is this efficient? 【发布时间】:2010-10-02 10:49:08 【问题描述】:

下面的查询做了我想做的事,但是,我不知道它是否有效。我浏览了Django aggregation 文档,将它们放在一起,看着查询,然后像一只迷糊的狗一样侧着头。

查询实际所做的是获取已发布条目的“name”和“name_slug”,其中包含一个或多个已批准的 cmets,并按最新评论的“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]

【问题讨论】:

【参考方案1】:

2) 是的,如果 settings.DEBUG 为 true,原始 sql 查询存储在 django.db.connection.queries 中。

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

【讨论】:

【参考方案2】:

我已将查询简化为:

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',则无需计算 cmets 并再次使用 comments__gte=1 过滤它们。

我会调查django.db.connection.queries。接缝很简单。谢谢!

【讨论】:

以上是关于Django:生成博客的活动条目列表。这有效率吗?的主要内容,如果未能解决你的问题,请参考以下文章

django 一个模板 - 许多视图 - 初学者

Django - 非连续月份

choiceField的“禁用”选项 - Django

使用 Struts2 在创建博客条目时生成动态 URL

Django 按顺序连接两个查询集

如何在 django 导航栏下拉列表中显示活动链接?