2016-01-25 52 views
4

我有一個Django應用程序,用戶登錄,設置各種主題,然後在所述主題下留下評論。下面的模型反映了這一基本的設立:具有挑戰性的Django查詢集構造

class Topic(models.Model): 
    topic_text = models.TextField() 
    submitted_on = models.DateTimeField(auto_now_add=True) 

class Comment(models.Model): 
    comment_text = models.TextField() 
    which_topic = models.ForeignKey(Topic) 
    submitted_by = models.ForeignKey(User) 
    submitted_on = models.DateTimeField(auto_now_add=True) 

對於每一個用戶,我試圖讓所有主題,其中的最近的5條評論任何一個被寫入用戶。換句話說,如果用戶沒有在主題最近的5條評論中評論,該主題將被排除在查詢集之外。

那麼我該如何去組建這個查詢集呢?順便說一句,我會告訴你我已經嘗試了什麼,但它是不足夠的,顯然是錯誤的。有人可以幫忙嗎?

+0

我覺得沒有意義要儘量選擇在此用戶評論,僅主題如果評論在前5名之內,儘管可能使用嵌套查詢。相反,我寧願選擇這個用戶評論的主題,然後通過代碼中評論的位置(和緩存,因爲它很重)來過濾它們。 –

+0

我同意。這是*,然後通過評論*部分的位置進行過濾,我發現幾乎不可能將我的頭包裹起來。 –

回答

1

我沒有測試過它,但子查詢應該可以工作。事情是這樣的:

Topic.objects.filter(
    comment__submitted_by__in=Comment.objects.values(
     'submitted_by' 
    ).order_by(
     '-submitted_on' 
    ).limit(5), 

    submitted_by=user 
) 

(添加.prefetch_related('comment_set')如果您計劃訪問的評論。)

+0

當我仔細查看我所擔心的要求時,我們的任何建議都無法正常工作。我會編輯,我們會考慮更多。 –

+0

你的編輯現在考慮所有的評論......問題是子查詢無法知道如何只選擇與當前主題相關的評論 – Pynchia

+0

確切地說:-(這可能更好做一個而不是做更復雜的事情。 –