QuerySet, Object has no attribute id – Django
Question:
I’m trying to fetch the id of certain object in django but I keep getting the following error
Exception Value: QuerySet; Object has no attribute id.
my function in 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')
The error occurs in the if condition in this part (attachedInfo=at.id). I checked that as when I removed it from the condition, everything was working fine.
Here’s 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
Any help why I’m getting this error?!
Answers:
The reason why you are getting the error is because at
is a QuerySet
ie: a list. You can do something like at[0].id
or use get
instead of filter
to get the at
object.
Hope it helps!
this line of code
at = AttachedInfo.objects.filter(attachedMarker=m.id, title=title)
returns a queryset
and you are trying to access a field of it (that does not exist).
what you probably need is
at = AttachedInfo.objects.get(attachedMarker=m.id, title=title)
In most cases you do not want to handle not existing objects like that. Instead of
ad[0].id
use
get_object_or_404(AttachedInfo, attachedMarker=m.id, title=title)
It is the recommended Django shortcut for that.
I got this error for almost 2 days, the main issue for this error solely depends on two files i.e.
models.py & views.py
I was getting this error because I wanted to create session from email id but it shows their is no attribute email so it wasn’t fetching any str object.
Solution:-
models.py
class Register(models.Model):
userid = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
email = models.EmailField(max_length=200)
password = models.CharField(max_length=100)
def __str__(self):
return "%s %s" %(self.name, self.email)
Create a string for the following you want data from according to your project.
views.py
if request.method == "POST":
emailx1 = request.POST['emailx']
passwordx1 = request.POST['passwordx']
if (Register.objects.filter(email=emailx1, password=passwordx1)).exists():
a = Register.objects.filter(email=emailx1).first()
request.session['session_name'] = a.email
request.session['session_id'] = a.userid
return render(request, "index.html", {"a": a})
Use .first() method with your Model.objects method. This have resolved my problem hope it would resolves yours too.
I’m trying to fetch the id of certain object in django but I keep getting the following error
Exception Value: QuerySet; Object has no attribute id.
my function in 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')
The error occurs in the if condition in this part (attachedInfo=at.id). I checked that as when I removed it from the condition, everything was working fine.
Here’s 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
Any help why I’m getting this error?!
The reason why you are getting the error is because at
is a QuerySet
ie: a list. You can do something like at[0].id
or use get
instead of filter
to get the at
object.
Hope it helps!
this line of code
at = AttachedInfo.objects.filter(attachedMarker=m.id, title=title)
returns a queryset
and you are trying to access a field of it (that does not exist).
what you probably need is
at = AttachedInfo.objects.get(attachedMarker=m.id, title=title)
In most cases you do not want to handle not existing objects like that. Instead of
ad[0].id
use
get_object_or_404(AttachedInfo, attachedMarker=m.id, title=title)
It is the recommended Django shortcut for that.
I got this error for almost 2 days, the main issue for this error solely depends on two files i.e.
models.py & views.py
I was getting this error because I wanted to create session from email id but it shows their is no attribute email so it wasn’t fetching any str object.
Solution:-
models.py
class Register(models.Model):
userid = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
email = models.EmailField(max_length=200)
password = models.CharField(max_length=100)
def __str__(self):
return "%s %s" %(self.name, self.email)
Create a string for the following you want data from according to your project.
views.py
if request.method == "POST":
emailx1 = request.POST['emailx']
passwordx1 = request.POST['passwordx']
if (Register.objects.filter(email=emailx1, password=passwordx1)).exists():
a = Register.objects.filter(email=emailx1).first()
request.session['session_name'] = a.email
request.session['session_id'] = a.userid
return render(request, "index.html", {"a": a})
Use .first() method with your Model.objects method. This have resolved my problem hope it would resolves yours too.