你好,我做了一個函數,它會根據創建它們的時間來返回帖子,並根據它們的投票數量進行排名。這是一個飼料。我不確定如果這是一種有效的方法,那麼我很重要,因爲這可能會篩選數千個帖子。我在這裏簡化了一下,並簡要解釋了每一步。我目前的擔憂和整個職能的一個職位(沒有註釋)在之後。如何優化此功能以返回Feed中的帖子。 Django
開始小時數參數是多少小時前獲得帖子。例如,如果startHours = 6,則只會返回六小時前創建的帖子。
def rank(request, startHours):
首先,我通過票
unorderedPosts=Post.objects.order_by('-votes')
然後帖子被排除由類別用戶已經指定
if request.user.is_authenticated():
preferences=request.user.categorypreference_set.filter(on=False)
for preference in preferences:
unorderedPosts=unorderedPosts.exclude(category_name=preference.category_name)
然後我使endHours,這始終是4小時訂購的所有文章提前開始時間參數
endHours=startHours+4 #4 hour time window
現在我分割無序的郵件,並從現在開始只在時間窗口startHours中創建結束小時。例如,如果startHours = 4,則只會返回4小時前但8小時前創建的帖子。
posts=unorderedPosts.filter(created__gte=(timezone.now()-datetime.timedelta(hours=endHours)))
posts=posts.exclude(created__gte=(timezone.now()-datetime.timedelta(hours=startHours)))
現在我做一個循環,直到將至少一種後發現,有適合的時間窗口創建日期的時間窗口向後移動。我使檢查變量防止無限循環(如果在200小時內沒有發現任何帖子,循環將退出)。
count=posts.count()
check=endHours
while count<1 and endHours<(check+200):
endHours+=4
startHours+=4
posts=unorderedPosts.filter(created__gte=(timezone.now()-datetime.timedelta(hours=endHours)))
posts=posts.exclude(created__gte=(timezone.now()-datetime.timedelta(hours=startHours)))
count=posts.count()
if count>=1: return posts, endHours
return posts
我最大的擔心是在開始時製作所有帖子的查詢集。此功能是爲了在小時間窗口中返回帖子,是否會通過對數據庫中的所有帖子進行排名而不必要地降低速度?我知道django/python查詢集相當高效,但不會對包含數千個對象的集合進行排序對於此函數來說很麻煩嗎?
如果這是一個問題,我怎樣才能讓它更有效率,同時保持一切可用?
這裏是整個事情的職位。
def rank(request, startHours):
unorderedPosts=Post.objects.order_by('-upVote')
if request.user.is_authenticated():
preferences=request.user.categorypreference_set.filter(on=False)
for preference in preferences: #filter by category preference
unorderedPosts=unorderedPosts.exclude(category_name=preference.category_name)
endHours=startHours+4 #4 hour time window
posts=unorderedPosts.filter(created__gte=(timezone.now()-datetime.timedelta(hours=endHours)))
posts=posts.exclude(created__gte=(timezone.now()-datetime.timedelta(hours=startHours)))
count=posts.count()
check=endHours
while count<1 and endHours<(check+200):
endHours+=4
startHours+=4
posts=unorderedPosts.filter(created__gte=(timezone.now()-datetime.timedelta(hours=endHours)))
posts=posts.exclude(created__gte=(timezone.now()-datetime.timedelta(hours=startHours)))
count=posts.count()
if count>=1: return posts
return posts
你提出了一些很好的建議!我現在基於下一個最新帖子創建時間窗口,而不是遍歷每個連續窗口。我把排序的順序先轉換成類別,然後再轉換成類別,最後是投票。我看着嘗試一個子查詢,但我發現我的後端(mysql)不如那個方法。非常感謝您的洞察! –
時間窗口的東西很大程度上取決於你想要做的事情 - 如果你正在尋找,比如說,不管時間多少,都有一定的最小數量的帖子,還有其他方法可以做到這一點。而且,是的,子查詢有點碰巧。 –