2013-05-15 4 views
8

Я пытаюсь получить идентификатор определенного объекта в django, но я продолжаю получать следующую ошибку: Исключительное значение: QuerySet; Объект не имеет идентификатора атрибута. моя функция в views.pyQuerySet, Object не имеет идентификатора 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') 

ошибка возникает в состоянии, если в этой части (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

эта строка кода

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

возвращает queryset

и вы пытаетесь получить доступ к полю его (что не существует).

, что вы, вероятно, нужно

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

это может вызвать ошибку. Чтобы обработать его изящно, сделайте '.filter' amd then' [0] ' – karthikr

+1

, что он возвращает, если в запросе есть 0 элементов? – EsseTi

+0

вам нужно проверить пустой набор запросов, а затем сделать [0]. Это то, что я имел в виду. – karthikr

12

Причина, по которой вы получаете ошибку, состоит в том, что at является QuerySet ie: a list. Вы можете сделать что-то вроде at[0].id или использовать get вместо filter, чтобы получить объект at.

Надеюсь, это поможет!

+0

Я использовал вместо фильтра фильтр и отлично работал. Большое спасибо. – omarsafwany

+0

Я наткнулся на это и попробовал фильтр и '' в [0] .id '' дает: 'dict' объект не имеет атрибута 'id'. Может быть, вы можете это исправить? – novski

1

В большинстве случаев вы не хотите, чтобы обрабатывать не существующие объекты, как это. Вместо

ad[0].id 

использования

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

Это рекомендуется Django shortcut для этого.