2009-01-20 30 views
1

下面的查詢做,我想什麼做的,但是,我不知道,如果它是有效的。我瀏覽了Django aggregation文檔,將它扔在一起,看着查詢並像困惑的狗一樣將我的頭部側向傾斜。Django:生成博客的活動條目列表。這是否有效?

什麼查詢實際上做的是得到發表條目的「名稱」和「name_slug」有一個或多個已覈準的意見和訂單的最新評論的「date_published」字段的結果。結果是最近激活的Entry的列表。

所以幾個問題。 (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

我已經減少了查詢到這一點:

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。它接縫簡單。謝謝!