django视图中的无限循环

时间:2012-10-04 21:49:10

标签: python django

我一直在试图找出为什么我没有返回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的方式导致错误。

对此有任何见解表示赞赏,谢谢。

2 个答案:

答案 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中的用户并在查询中将其排除在外。谢谢你的回复。