2017-10-11 3 views
0

Ich bekomme nur keine Antwort, was nicht funktioniert von Django. Django sagt, alles ist in Ordnung. Ich möchte die Ergebnisse beschränken, die ich von meiner Datenbank bekomme. In der documentation wird gesagt, dass der erste Parameter der Offset ist und der zweite wie viel Ergebnisse ich bekomme, beginnend mit dem Offset + 1. Was mache ich hier falsch?Begrenzen von QuerySets in Django funktioniert nicht

Wenn ich die Abfragen nicht einschränken, funktioniert alles gut. Also sollte der Fehler durch Verwendung der Begrenzung sein.

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

überprüfen Sie Ihre „Offset“ Wert – Robert

+0

offset = Anfrage .data.get ('offset', 0) – Robert

+0

"Offset" funktioniert einwandfrei. Ich bekomme es von Ajax. – Coder949

Antwort

4

Sie falsch verstanden haben, wie Arbeiten in Python schneiden. Die 2 bedeutet nicht, zwei Elemente zurückzugeben, es bedeutet, bei dem zweiten Element (0 Index) zu stoppen und es nicht einzuschließen. Wenn der Offset 2 oder mehr beträgt, ist Ihr Sliced-Queryset leer.

Wenn Sie zwei Elemente enthalten sein sollen, dann möchten Sie:

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

Dachte über so etwas, aber ich habe nicht verstanden, wie es richtig funktioniert. Jetzt weiß ich es, danke! – Coder949

1

Sie Ihre Anfrage nur einfach tun können, eine Scheibe:

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]: 
Verwandte Themen