QuerySet,对象没有属性 id - Django
Posted
技术标签:
【中文标题】QuerySet,对象没有属性 id - Django【英文标题】:QuerySet, Object has no attribute id - Django 【发布时间】:2013-05-10 11:15:10 【问题描述】:我正在尝试在 django 中获取某些对象的 id,但我不断收到以下错误 异常值:查询集;对象没有属性 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
任何帮助我为什么会收到此错误?!
【问题讨论】:
【参考方案1】:这行代码
at = AttachedInfo.objects.filter(attachedMarker=m.id, title=title)
返回一个queryset
并且您正在尝试访问它的一个字段(不存在)。
你可能需要的是
at = AttachedInfo.objects.get(attachedMarker=m.id, title=title)
【讨论】:
这可能会引发错误。要优雅地处理它,请执行.filter
amd 然后[0]
如果查询集有 0 个元素,它会返回什么?
你必须检查空查询集,然后执行 [0] 这就是我的意思。
@EsseTi 你是对的。我改变了过滤器,一切都很好。真的没想到。非常感谢
好的。但请注意,如果没有值,它将返回异常。【参考方案2】:
您收到错误的原因是因为at
是QuerySet
即:一个列表。您可以执行at[0].id
之类的操作或使用get
而不是filter
来获取at
对象。
希望对你有帮助!
【讨论】:
我用 get 代替了过滤器,效果很好。非常感谢。 我偶然发现了这个并尝试了过滤器,''at[0].id'' 给出:'dict' 对象没有属性'id'。也许你可以纠正那个?【参考方案3】:在大多数情况下,您不想像这样处理不存在的对象。而不是
ad[0].id
使用
get_object_or_404(AttachedInfo, attachedMarker=m.id, title=title)
为此推荐Django shortcut。
【讨论】:
【参考方案4】:我收到此错误将近 2 天,此错误的主要问题仅取决于两个文件,即
models.py 和views.py
我收到此错误是因为我想从电子邮件 ID 创建会话,但它显示它们没有属性电子邮件,因此它没有获取任何 str 对象。
解决方案:-
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)
根据您的项目为以下您想要的数据创建一个字符串。
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() 方法。这已经解决了我的问题,希望它也能解决你的问题。
【讨论】:
以上是关于QuerySet,对象没有属性 id - Django的主要内容,如果未能解决你的问题,请参考以下文章
Django QuerySet 对象没有属性'objects
Django 'QuerySet' 对象没有使用 modelform 的属性'split'
AttributeError:“QuerySet”对象没有属性“标签”