2013-05-15 13 views
8

Ich versuche, die ID eines bestimmten Objekts in Django zu holen, aber ich bekomme immer den folgenden Fehler Exception Value: QuerySet; Das Objekt hat keine Attribut-ID. meine Funktion in views.pyQuerySet, Objekt hat keine Attribut-ID - Django

@csrf_exempt 
def check_question_answered(request): 
    userID = request.POST['userID'] 
    markerID = request.POST['markerID'] 
    title=request.POST['question'] 
    m = Marker.objects.get(id=markerID) 
    u = App_User.objects.get(id=userID) 
    print userID 
    print markerID 
    print title 
    # userID='1' 
    # markerID='1' 
    # title='Hello' 
    at = AttachedInfo.objects.filter(attachedMarker=m.id, title=title) 
    print 'user' 
    print u.id 
    print 'marker' 
    print m.id 
    print 'att' 
    print at 
    #print at.id 
    if(Answer.objects.filter(marker=m.id, user=u.id, attachedInfo=at.id)): 
     print 'pass' 
     return HttpResponse('already answered') 
    else: 
     print 'not' 
     return HttpResponse('not answered yet') 

Der Fehler tritt in dem Zustand, wenn in diesem Teil (attachedInfo = at.id). Ich habe das überprüft, als ich es aus dem Zustand entfernte, alles funktionierte gut.

Hier models.py

class AttachedInfo(models.Model): 
    title = models.CharField(max_length=200) 
    helpText = models.CharField(max_length=200, null=True, blank=True) 
    type = models.CharField(max_length=200) 
    attachedMarker = models.ForeignKey(Marker) 
    answer1 = models.CharField(max_length=200, null=True, blank=True) 
    answer2 = models.CharField(max_length=200, null=True, blank=True) 
    answer3 = models.CharField(max_length=200, null=True, blank=True) 
    answer4 = models.CharField(max_length=200, null=True, blank=True) 
    correctAnswer = models.CharField(max_length=50, null=True, blank=True) 
    optionalMessage = models.CharField(max_length=200, null=True, blank=True) 
    def __unicode__(self): 
     return self.title 

class Answer(models.Model): 
    user = models.ForeignKey(App_User) 
    app = models.ForeignKey(App, null=True, blank=True) 
    marker = models.ForeignKey(Marker) 
    attachedInfo = models.ForeignKey(AttachedInfo) 
    textAnswer = models.CharField(max_length=200, null=True, blank=True) 
    mcqAnswer = models.CharField(max_length=200, null=True, blank=True) 
    answered = models.BooleanField(default=False) 
    def __unicode__(self): 
     return self.attachedInfo.title 

Jede Hilfe, warum ich diesen Fehler bin immer ?!

Antwort

19

diese Codezeile

at = AttachedInfo.objects.filter(attachedMarker=m.id, title=title)

gibt ein queryset

und Sie versuchen, ein Feld, darauf zuzugreifen (das nicht existiert).

was Sie wahrscheinlich benötigen, ist

at = AttachedInfo.objects.get(attachedMarker=m.id, title=title) 
+1

Dies könnte einen Fehler verursachen. Um es anmutig zu handhaben, machen Sie ein '.filter 'und dann' [0] ' – karthikr

+1

Was gibt es zurück, wenn das Abfrage-Set 0 Elemente hat? – EsseTi

+0

Sie müssen auf leere Abfrage überprüfen und dann tun Sie eine [0] Das ist, was ich meinte. – karthikr

12

Der Grund, warum Sie den Fehler erhalten, ist, weil at eine QuerySet dh eine Liste ist. Sie können etwas wie at[0].id tun oder get anstelle von filter verwenden, um das Objekt at zu erhalten.

Hoffe es hilft!

+0

Ich benutze statt Filter und funktioniert gut. Vielen Dank. – omarsafwany

+0

Ich stolperte darüber und versuchte den Filter und '' bei [0] .id '' gibt: 'dict' Objekt hat kein Attribut 'ID'. Vielleicht kannst du das korrigieren? – novski

1

In den meisten Fällen Sie wollen nicht behandeln nicht vorhandene Objekte ähnlich. Statt

ad[0].id 

Verwendung

get_object_or_404(AttachedInfo, attachedMarker=m.id, title=title) 

Es ist die Django shortcut dafür empfohlen.