Django中Project对象无remark_set属性报错求助
Django AttributeError: 'Project' object has no attribute 'remark_set' 解决办法
问题原因
你在Remark模型的project外键字段中指定了related_name='project_content_type',这会替换Django默认生成的反向关联属性名remark_set。因此你无法再通过project.remark_set.all()查询关联评论,且你之前尝试的project_content_type.remark_set.all()是错误用法。
解决方案
直接使用自定义的related_name作为反向关联属性名即可:
修正后的views.py代码:
def project(request, pk): project = Project.objects.get(id=pk) # 使用设置的related_name查询关联的Remark数据 remark_made = project.project_content_type.all() context = {'project':project, 'remark_made':remark_made} return render(request, 'base/project.html',context)
备选方案
如果你更习惯默认的remark_set,可以删除Remark模型中project字段的related_name参数,恢复默认行为:
修改后的models.py中Remark类代码:
class Remark(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) # 移除related_name,使用默认的remark_set project = models.ForeignKey(Project, on_delete=models.CASCADE) body = models.TextField() updated = models.DateTimeField(auto_now = True) created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.body[0:50]
此时原views.py代码即可正常运行。
附原报错及代码
报错信息
response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\lavis\Desktop\aai\env\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\lavis\Desktop\aai\base\views.py", line 80, in project project = project.remark_set.all() ^^^^^^^^^^^^^^^^^^ AttributeError: 'Project' object has no attribute 'remark_set'
原models.py代码
class Project(models.Model): host = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) #p_id = name = models.CharField(max_length=200) location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True) totalamount = models.IntegerField(null=True, blank=True) payments_todate = models.IntegerField(null=True,blank=True) description = models.TextField(null=True,blank = True) updated = models.DateTimeField(auto_now = True) created = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['-updated','-created'] def __str__(self): return self.name class Remark(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) project = models.ForeignKey(Project,related_name='project_content_type', on_delete=models.CASCADE) body = models.TextField() updated = models.DateTimeField(auto_now = True) created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.body[0:50]
原views.py代码
def project(request, pk): project = Project.objects.get(id=pk) remark_made = project.remark_set.all() context = {'project':project, 'remark_made':remark_made} return render(request, 'base/project.html',context)
内容的提问来源于stack exchange,提问作者Lavish Raman
相关产品推荐
相关产品推荐

