我一直在试图找出为什么我没有返回PrivateMessages列表。有时一双不同的眼睛可以立即发现它,所以我在这里张贴这个希望有人发现错误。
这是一个获取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个晚上有欢迎。
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点的时候,我看到的是无限循环。它适用于其他用户,但在第一个用户中订购pm的方式导致错误。
对此有任何见解表示赞赏,谢谢。
答案 0 :(得分:0)
我认为您的休息条件无效:
if len(bl) >= 20 or not pmr:
# Stop if I have more than 20 messages? Shouldn't I continue filtering?
break
应该是:
if n >= 0:
# Stop only if I have 20 or less [n = 20 - len(bl)], continue otherwise
break
我可能误解了一些东西,但是你的while循环的最后一部分是副作用。请考虑重写代码以使其更清晰。
答案 1 :(得分:0)
事实证明,同一个用户中有太多pm是连续的,所以当它试图获取n个私人消息时它从未达到20.我添加了一个函数来创建一个列表bl中的用户并在查询中将其排除在外。谢谢你的回复。