web-dev-qa-db-ja.com

QuerySet、オブジェクトには属性IDがありません-Django

Djangoで特定のオブジェクトのIDを取得しようとしていますが、次のエラー例外が発生し続けます例外値:QuerySet;オブジェクトに属性IDがありません。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') 

この部分のif条件(attachedInfo = at.id)でエラーが発生します。コンディションから外した時と同じように全て動作していたのを確認しました。

これが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

このエラーが発生する理由を教えてください。

19
omarsafwany

このコード行

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

queryset を返します

そのフィールドにアクセスしようとしている(存在しない)。

あなたがおそらく必要なのは

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

エラーが発生する理由は、atQuerySet、つまりリストであるためです。 getオブジェクトを取得するには、at[0].idのようなことを行うか、filterの代わりにatを使用します。

それが役に立てば幸い!

16
Paulo Bu

ほとんどの場合、そのような既存のオブジェクトを処理する必要はありません。の代わりに

ad[0].id

使用する

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

推奨されるのは Djangoショートカット です。

1
oberam-eng