2017-02-09 6 views
-2

Ich habe einen Fehler, TypeError at/ResultJSON/v1/Ergebnisse/ 'Tuple' Objekt ist nicht aufrufbar.TypeError 'Tuple' Objekt ist nicht aufrufbar

Ich schrieb ein Verfahren in views.py,

results = OrderedDict([ 
     ('id',x.id) 
     ('name', x.name) 
     for x in Post.objects.all() 
    ]) 

Wenn ich diesen Fehler durchsucht, lese ich die Fehler passieren, weil es kein Komma (,).

Aber ich fügte Kommas zwischen ('id', x.id) und ('name', x.name) und letzte von ('name', x.name), ich habe einen Fehler Kein Python-Interpreter konfiguriert für das Projekt.

Also, ich kann nicht verstehen, warum dieser Fehler passiert.Wie kann ich es beheben?

In views.py schrieb ich

import json 
from collections import OrderedDict 
from django.http import HttpResponse 
from accounts.models import Post 


def render_json_response(request, data, status=None): 

    json_str = json.dumps(data, ensure_ascii=False, indent=2) 
    callback = request.GET.get('callback') 
    if not callback: 
     callback = request.POST.get('callback') 
    if callback: 
     json_str = "%s(%s)" % (callback, json_str) 
     response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status) 
    else: 
     response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status) 
    return response 

def UserResult(request): 

    results = OrderedDict([ 
     ('id',x.id) 
     ('name', x.name) 
     for x in Post.objects.all() 
    ]) 

    data = OrderedDict([ ('results', results) ]) 
    return render_json_response(request, data) 
+0

Was versuchen Sie hier zu erreichen? Ein Wörterbuch kann nur ** eindeutige ** Schlüssel enthalten, Sie können nicht mehrere "ID" - und "Name" -Schlüssel erzeugen und das funktioniert. –

+0

Versuchen Sie vielleicht, stattdessen eine * Wörterbuchliste * zu erstellen? –

Antwort

1

Sie mischen Syntax; Sie können kein Listenverständnis einfügen, das mit einigen literalen Elementen vermischt ist, und ein Listenverständnis kann nicht mehr als ein Element pro Iteration erzeugen.

Darüber hinaus können Sie kein Wörterbuch (geordnet oder nicht) mit mehreren Kopien eines Schlüssels erstellen.

Ich vermute, dass Sie versuchen, mehrere Wörterbücher stattdessen in einer Liste zu erstellen, von denen jeder die ID und den Namen enthält:

results = [OrderedDict([('id', x.id), ('name', x.name)]) 
      for x in Post.objects.all()] 

Es kann effizienter und lesbar sein, die Datenbank nur für die ID und den Namen abfragen Felder:

fields = ('id', 'name') 
results = [OrderedDict(zip(fields, x)) 
      for x in Post.objects.order_by. values_list(*fields)] 
0

Die ganze bestellte dict, was Sie versuchen, sieht ein wenig überflüssig zu machen, schaffen es nur die django mit QuerySet

results = Post.objects.order_by().values_list('id', 'name') # or values().. 
+0

Es wäre konsistenter, 'values ​​()' (returns dictionaries) anstelle von 'values_list' (gibt Tupel zurück) zu verwenden. Das obige funktioniert, * es sei denn * die Reihenfolge der Schlüssel in der Antwort ist wichtig, in diesem Fall wäre ein geordneter Diktat erforderlich. – Alasdair

+0

@Alasdair - Ja, ich hatte nicht herausgefunden, welches wäre das Beste für den Anwendungsfall des OP hier, weil es überhaupt nicht klar ist, wozu sie das verwenden wollen. (Ich kann mir nichts vorstellen, wo eine Liste von geordneten Diktaten nützlich wäre.) – Sayse

+0

thx, ur comments.Wenn ich ur codes geschrieben habe, bekam ich einen Fehler, TypeError at/ResultJSON/v1/results/ ist nicht JSON serializable Was kann ich tun, um es zu beheben? – user7523656

Verwandte Themen