Python ';非类型';对象没有属性';七五';尽管物体存在
我正在创建一个网站,用户可以创建一个项目。每个项目有10个宏观问题。每个宏观问题都有子问题 我正试图找到一个宏观问题的答案Python ';非类型';对象没有属性';七五';尽管物体存在,python,django,Python,Django,我正在创建一个网站,用户可以创建一个项目。每个项目有10个宏观问题。每个宏观问题都有子问题 我正试图找到一个宏观问题的答案 projects\u id包含我数据库中的所有项目 projects = Project.objects.all() projects_id = [] for project in projects: projects_id.append(project.id) 所以我做了一个for循环: for project_id in projects_id
projects\u id
包含我数据库中的所有项目
projects = Project.objects.all()
projects_id = []
for project in projects:
projects_id.append(project.id)
所以我做了一个for循环:
for project_id in projects_id:
seventh_question_project = Seventhquestion.objects.all().filter(project=project_id).first()
answer_seventh_five = seventh_question_project.seventh_five
if answer_seventh_five == "No":
unaudited_projects.append(answer_seventh_five)
else:
audited_projects.append(answer_seventh_five)
如果我使用控制台,我可以检索答案\u seventh\u five
:
但是,如果加载页面,我会得到:
“NoneType”对象没有属性“seventh_-five”
这一点我无法解释,因为answer\u seventh\u five
存在(因为我通过控制台检索它来测试它)
可能原因是我正在筛选,而不是使用get
获取对象
我试过:
seventh_question_project = Seventhquestion.objects.get(project=project_id)
但我得到:
第七个问题匹配查询不存在
但是:
seventh\u question\u project=Seventhquestion.objects.all()
works不通过ID。这不是Django ORM的用途。只需对项目本身进行循环:
for project in Project.objects.all():
seventh_question_project = Seventhquestion.objects.all().filter(project=project).first() # <-- not project_id!
# or better:
# seventh_question_project = project.seventhquestion_set.first()
if seventh_question_project:
# you should always check, because you need to write fool-proof code
answer_seventh_five = seventh_question_project.seventh_five
...
这个怎么样
seventh\u question\u project=Seventhquestion.objects.filter(project=project\u id.first())
答案是第七个问题
您在一堆项目中循环_id
,只需要其中一个项目不存在,就会发生此错误。当您在控制台中尝试时,您尝试了哪些ID?另外,不要使用get()
,因为从外观上看,这是一个一对多关系,因此如果存在0或>1个对象,这将引发异常。我确保所有projects\u id
仅包含现有项目。请看编辑。项目
和第七个问题
之间的关系是一对一的。每个项目只能有一个第七个问题。但这不是关于现有的项目,而是关于现有的具有项目外键的Seventhquestion
对象。此外,如果字段是project
,则应按如下方式进行筛选:filter(project=)
而不是按project\u id进行筛选。如果您只有id,则应filter(project\u id=project\u id)
。FK字段指的是实际对象,这就是为什么在Django中通常不传递ID,而是传递实际对象,从而使代码更具可读性。请使用调试器。在回答第七个问题项目的第七个问题项目的第七个问题项目上放置一个断点。在每个循环迭代中检查第七个问题项目。我试着去做。我想,如果我将Seventhquestion.seventh_-five
设置为数据库中的某个值,比如default=“No
,这会解决没有对象的风险吗?
for project in Project.objects.all():
if hasattr(project, "seventhquestion"):
# still need to check, you never know
answer_seventh_five = project.seventhquestion.seventh_five
...