我已經試圖找出爲什麼我沒有返回PrivateMessages列表。有時候一對不同的眼睛可以馬上發現,所以我在這裏發佈這個希望有人發現錯誤。django視圖中的無限循環
這是一個獲取20個或更少的私人消息並刪除同一用戶的重複消息的函數,即每個用戶只有1條消息將在返回的pm批處理中進行。
它還排除處於「靜音」列表中的用戶。這些工作正常,所以我不認爲這與沉默位有關。
在調用remove_duplicate_users之後,我得到最後一個對象的ID,以便在下一個查詢中使用它。
我沖洗並重復,直到列表中有20個對象準備返回或查詢不返回任何內容。
def get_private_messages(request):
ss = Silenced.objects.filter(user=request.user)
last_pm_id = None
n = 20
bl = []
while True:
if last_pm_id:
pmr = PrivateMessage.objects.filter(user=request.user,hidden=False,id__lt=last_pm_id).exclude(sender__in=[s.brat for s in ss]).order_by('-id')[:n]
else:
pmr = PrivateMessage.objects.filter(user=request.user,hidden=False).exclude(sender__in=[s.brat for s in ss]).order_by('-id')[:n]
l = list(pmr)
bl = bl + l
bl = remove_duplicate_senders(bl)
n = 20 - len(bl)
last_pm_id = bl[-1].id
if len(bl) >= 20 or not pmr:
break
return HttpResponse(bl)
這是刪除重複的用戶消息的功能。它對於名爲pin或note的用戶來說是個例外,如果pm.info1匹配只有前10個晚上的welcome。
def remove_duplicate_senders(pmr):
l = []
a = False
for p in pmr:
a = True
if p.sender.username in ['pin','note'] or p.info1=='welcome':
l.append(p)
continue
for px in l:
if p.sender.username == px.sender.username:
a = False
break
if a:
l.append(p)
return l
我用來測試的用戶有超過60分的,但我得到什麼似乎是一個無限循環,當我嘗試檢索前20分的。它可以和其他用戶一起工作,但是在第一個用戶中下訂單的方式會導致錯誤。
任何有識之士在此表示讚賞,謝謝。
第二位代碼中的循環有點奇怪:你在循環中向'l'添加東西,然後仍然在循環中通過'l'本身。這是正確的還是存在縮進問題? –
對不起,我複製了第一個功能錯誤,現在我修好了。 – madprops
呃這樣深奧的使用變量名稱。我在這裏看到了一些不一致的地方:'return Httpresponse(pms)'(where pms defined)and'sender__in = [s.breakt for s in ss]','sender__in = [s.brat for s in ss] '(相信應該是一樣的)。你寫的函數沒有任何無限循環的副作用,我可以告訴。 –