2013-01-06 111 views
2

我有兩個模型對象,他們有一個多對多的關係 -Django的查詢集階濾波器

class Note(models.Model): 
    title = models.CharField(max_length=127) 
    body = models.TextField() 
    is_deleted = models.BooleanField() 

    def __unicode__(self): 
     return "{} - {}".format(self.title, self.body) 

class Tag(models.Model): 
    tag_name = models.CharField(max_length = 100) 
    notes = models.ManyToManyField(Note) 

我想基於非刪除註釋的計數訂購Tag對象。我可以使用Tag.objects.annotate(notes_count=Count('notes')).order_by('-notes_count')通過計數筆記進行排序,但是此計數包括將標記刪除爲真的筆記。我的問題是,如何運行這個命令來按未刪除音符的計數來排序標籤(即note.is_deleted = False)?

我試圖限定標籤的方法,其僅返回非刪除音符,即 -

def non_deleted_notes(self): 
    return self.notes.filter(is_deleted=False) 

然後替換Count('notes')Count('non_deleted_notes'),但這導致一個錯誤。

+0

它導致什麼錯誤? –

+0

'FieldError at /' '無法將關鍵字'non_deleted_notes'解析爲字段。選項有:id,notes,tag_name' –

+0

聚合查詢在數據庫級別工作。他們不能基於模型方法 – second

回答

1

我不認爲這是由查詢集API的支持,所以你可能需要求助於.extra()

+0

感謝您的建議。這是我現在使用的,除非有更好的建議出現 - 'Tag.objects.annotate(notes_count = Count('id'))。order_by(' - notes_count')。extra(tables = ['scriblets_tag', 'scriblets_tag_notes','scriblets_note'],其中= ['scriblets_tag.id = scriblets_tag_notes.tag_id','scriblets_tag_notes.note_id = scriblets_note.id','scriblets_note.is_deleted =%s'],params = [False])' –

+0

好奇的是,這是由Django生成的查詢 - 「SELECT」scriblets_tag「。」id「,」scriblets_tag「。」tag_name「,COUNT(」scriblets_tag「。」id「)AS」notes_count「FROM」scriblets_tag「 ,「scriblets_tag_notes」,「scriblets_note」WHERE scriblets_tag.id = scriblets_tag_notes.tag_id AND scriblets_tag_notes.note_id = scriblets_note.id AND scriblets_note.is_deleted = False GROUP BY「scriblets_tag」。「id」,「scriblets_tag」。「tag_name」ORDER BY「 notes_count「DESC」 –