web-dev-qa-db-fra.com

QuerySet, l'objet n'a pas d'identifiant d'attribut - Django

J'essaie d'extraire l'identifiant d'un certain objet dans Django mais je continue à avoir l'erreur suivante Valeur d'exception: QuerySet; L'objet n'a pas d'attribut id . Ma fonction dans views.py

@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') 

L'erreur se produit dans la condition if de cette partie (attachmentInfo = at.id). J'ai vérifié que lorsque je l'ai retirée de l'état, tout fonctionnait bien.

Voici 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

Toute aide, pourquoi je reçois cette erreur?!

13
omarsafwany

cette ligne de code

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

retourne un queryset

et vous essayez d'accéder à un champ de celui-ci (qui n'existe pas).

ce dont vous avez probablement besoin, c'est

at = AttachedInfo.objects.get(attachedMarker=m.id, title=title)
30
EsseTi

La raison pour laquelle vous obtenez l'erreur est parce que at est une QuerySet c'est-à-dire une liste. Vous pouvez faire quelque chose comme at[0].id ou utiliser get au lieu de filter pour obtenir l'objet at.

J'espère que ça aide!

16
Paulo Bu

Dans la plupart des cas, vous ne souhaitez pas gérer de tels objets. Au lieu de

ad[0].id

utilisation

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

C'est le raccourci recommandé Django pour cela.

1
oberam-eng