在Django中限制QuerySet不起作用

时间:2017-10-11 12:30:40

标签: python ajax django

我无法回答Django无法解决的问题。 Django说一切都很好。我想限制从数据库中获得的结果。在documentation中说第一个参数是偏移量,第二个参数是从偏移量+1开始得到的结果。我在这里做错了什么?

当我不限制查询时,一切正常。所以错误应该是使用限制。

views.py

def ajax_more(request):
    categoryid = request.GET.get('categoryid', None)
    query = request.GET.get('query', None)
    offset = request.GET.get('offset', None)

    if query:
        if categoryid == "6":
            advertisements = Advertisement.objects.filter(title__contains=query)[int(offset): 2]
        else:
            advertisements = Advertisement.objects.filter(category__id=categoryid, title__contains=query)[int(offset): 2]
    else:
        if categoryid == "6":
            advertisements = Advertisement.objects.all()[int(offset): 2]
        else:
            advertisements = Advertisement.objects.filter(category__id=categoryid)[int(offset): 2]


    advertisements_list = []
    for advertisement in advertisements:
         advertisements_list.append({
            'id': advertisement.id, 
            'description': advertisement.description,
            'title': advertisement.title,
            'picture_url': advertisement.image.url,
            'date': advertisement.date })

    data = { 'advertisements_list': advertisements_list }
    return JsonResponse(data)

2 个答案:

答案 0 :(得分:4)

你误解了切片在Python中是如何工作的。 2并不意味着返回两个项目,它意味着停在第二个项目(0索引)并且不包括它。如果offset为2或更大,则切片的查询集将为空。

如果您想要包含两个项目,那么您需要:

advertisements = Advertisement.objects.all()[int(offset):int(offset)+2]

答案 1 :(得分:1)

您只需一个片段就可以简单地进行查询:

if query:
    if categoryid == "6":
        advertisements = Advertisement.objects.filter(title__contains=query)
    else:
        advertisements = Advertisement.objects.filter(category__id=categoryid, title__contains=query)
else:
    if categoryid == "6":
        advertisements = Advertisement.objects.all()
    else:
        advertisements = Advertisement.objects.filter(category__id=categoryid)

inteval = slice(int(offset), int(offset)+2))
for advertisement in advertisements[inteval]: