Python QuerySet,对象没有属性id-Django
我试图在django中获取某个对象的id,但一直出现以下错误 异常值:QuerySet;对象没有属性id。 我在views.py中的函数Python QuerySet,对象没有属性id-Django,python,django,django-models,django-views,django-queryset,Python,Django,Django Models,Django Views,Django Queryset,我试图在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.ob
@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
我为什么会犯这个错误 出现错误的原因是
at
是一个QuerySet
即:一个列表。您可以在[0]处执行类似于的操作。id
或使用get
而不是filter
来获取at
对象
希望有帮助 这行代码
at=AttachedInfo.objects.filter(attachedMarker=m.id,title=title)
返回一个
您正试图访问它的一个字段(该字段不存在)
你可能需要的是
at = AttachedInfo.objects.get(attachedMarker=m.id, title=title)
在大多数情况下,您不希望这样处理不存在的对象。而不是
ad[0].id
使用
建议这样做。我收到这个错误将近2天了,这个错误的主要问题完全取决于两个文件,即 models.py和views.py 我得到这个错误是因为我想从电子邮件id创建会话,但它显示他们的电子邮件没有属性,所以它没有获取任何str对象 解决方案:- 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
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)
根据您的项目,为要从中获取数据的以下内容创建字符串
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})
在Model.objects方法中使用.first()方法。这已经解决了我的问题,希望它也能解决你的问题。这可能会引发错误。要优雅地处理它,请执行
.filter
amd,然后执行[0]
如果queryset有0个元素,它会返回什么?您必须检查queryset是否为空,然后执行[0],这就是我的意思。@EsseTi您是对的。我改变了过滤器,以获得和一切都工作得很好。我真的没想到。非常感谢。但是请注意,如果没有值,它将返回一个异常。我使用get而不是filter,工作得很好。非常感谢。我无意中发现了这一点,并尝试了过滤器,而“at[0].id”给出了:“dict”对象没有属性“id”。也许你能纠正一下?