2017-01-24 181 views
1

假設我的模型:Django的過濾器查詢集基於另一個查詢集的計數

model book 
    charfield name 

model review 
    charfield bookname 

有沒有辦法來過濾/排除與審查書籍數爲零?我在stackoverflow上直觀地看到了這一點,但無法找到答案。這不是一個家庭作業問題。我有一個查詢集約。大小約爲200,000,從中我得出結論認爲,通過將查詢集轉換爲python列表進行過濾並進行篩選並轉換回來並不明智。有人可以幫我弄這個嗎? 感謝

+1

是否有一個原因您的評論模型有一個書名的charfield,而不是直接更正的外鍵t Book對象?如果模型實際鏈接,過濾器會更容易做到。另外,從您的問題來看,您是否想要保留或排除沒有來自查詢集的評論的書籍並不明確。 – ChidG

+0

@ChidG感謝您的回覆。假設我有大量書籍和評論,我認爲每次添加評論時都會將評論與書籍鏈接起來,因爲查找時間太長。應該把它們聯繫起來,以此來支持這一點嗎? – verticese

+0

通過外鍵鏈接它們絕對是解決這個問題的標準,最佳實踐方式。在兩張表之間進行數據庫連接的時間比沒有連接它們造成的其他問題要少得多。例如,您的數據庫需要更大(磁盤空間),因爲書名將全部存儲在多個位置。當你有多本同名的書時會發生什麼?或者當某人在評論中錯誤地輸入書名?我建議你閱讀一下關於關係數據庫的設計。 – ChidG

回答

1

首先,你可以查詢本書裏面有檢討的列表,然後通過使用Django exclude

bookname_has_review = Review.objects.all().distinct().values_list('bookname', flat=True) 
book_not_have_review = Book.objects.all().exclude(name__in=bookname_has_review) 
2

得到恭維因爲我強烈建議您更改模型,包括審查,預定的外鍵(對於這樣做的許多其他好處),而不是試圖解決你問的確切問題,我會給你一個關於如何用外鍵編寫你的模型的提示,然後如何解決你的問題在外部關鍵關係的背景下被問到。

下面是新車型,我認爲你應該寫:

from django.db import models 

class Book(models.Model): 
    name = models.Charfield() 

class Review(models.Model): 
    book = models.ForeignKey(Book, related_name='reviews') 

然後,對於具有任何評論的所有書籍進行篩選,你可以這樣做:

books_with_reviews = Book.objects.filter(reviews__isnull=False).distinct() 

或者書籍沒有評論:

Book.objects.filter(reviews__isnull=True).distinct() 
+0

謝謝,我會改變我的模式。這是一個好主意。 – verticese