2013-02-10 165 views
3

是否有可能在Django中有「條件」註釋? 比方說,有以下型號Django過濾條件註釋

class Author(models.Model): 
    name = models.CharField() 

class Article(models.Model): 
    title = models.CharField() 
    published = models.BooleanField() 

現在我想選擇作者的一些限制(過濾)的查詢集,並與這兩個總書註釋指望他們和出版的書籍數,供以後使用(例如應用過濾作者queryset或對其進行排序)。像

Author.objects.filter(name__icontains = 'a').annotate(total_books = Count('books')).annotate(published_books = Count('books', <here published=true filter>))

東西是可能的把戲?

+0

有沒有找到解決辦法呢?我有類似的情況。我將文件附加到項目中,可以使用刪除的布爾字段刪除文件。當我在文件上註釋以獲取其狀態時,它包含已刪除的文件,即使文件對象管理器告訴Django忽略刪除的文件(除非指定)。 – Furbeenator 2014-06-13 16:18:04

回答

1

Django的ORM調用轉換爲SQL。如果它不能用SQL查詢完成,通常意味着你不能用ORM來完成它。你要求的是不同的where條款(除非我錯過了某些東西或誤解),需要不同的查詢。這使你有2種選擇:

  1. 運行2個不同的查詢(具有不同filter()參數)
  2. 如果這是一個「昂貴」的查詢,你不想跑兩次,你可以拉取數據從DB一次,並在正常的Python代碼中進行聚合。
+0

無法編輯我的手機的問題。無論如何,我喜歡它生成SQL與兩個計數左外連接到文章表,其中一個條件已發佈=真.. – migajek 2013-02-11 00:57:33

0

只是一個簡單的想法,你可以嘗試:

Author.objects.filter(name__icontains = 'a').\ 
    annotate(total_books = Count('books')).\ 
    annotate(published_books = Count('books__published')) 

由於BooleanField寫爲0/1整數,它可以做的工作。或者它可能不:)只是在你的代碼中嘗試它。

+0

我剛剛認爲我是necrobumper。抱歉... – aherok 2013-05-24 07:00:26