Django使用ForeignKey外键反向查询报错找不到item_set属性如何解决
问题原因
- Django 中 ForeignKey 字段的反向关联管理器默认命名规则为
小写的关联模型类名 + _set。你的从表模型名称为Projects,因此Project_types实例默认生成的反向管理器名称是projects_set,你代码中使用的item_set不符合命名规则,因此会提示属性不存在。 - 你代码中通过
Project_types(project_type='games')实例化的对象并未持久化到数据库,即使反向管理器名称正确,也无法查询到对应的关联数据。
解决方法
方案1:使用默认反向管理器查询
先从数据库获取已存在的Project_types实例,再调用正确的默认反向管理器名称即可:
# 从数据库查询对应分类实例 game_project_type = Project_types.objects.get(project_type='games') # 调用默认反向管理器查询关联的Projects数据 related_projects = game_project_type.projects_set.all()
方案2:自定义反向关联名(推荐)
在定义ForeignKey字段时通过related_name参数指定自定义反向管理器名称,降低记忆成本,提升代码可读性:
- 修改模型代码
class Projects(models.Model): # 新增related_name参数指定反向管理器名为projects project_types = models.ForeignKey(Project_types, on_delete=models.CASCADE, related_name='projects') project = models.CharField(max_length=200) def __str__(self): return self.project
- 执行数据库迁移命令生效
python manage.py makemigrations python manage.py migrate
- 调用自定义反向名查询
game_project_type = Project_types.objects.get(project_type='games') related_projects = game_project_type.projects.all()
内容的提问来源于stack exchange,提问作者Jack Ciafardo
相关产品推荐
相关产品推荐

