我无法回答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)
答案 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]: