Django使用get_queryset报错:无法将关键字'name'解析为字段
解决Django中从URL捕获组筛选关联Post的FieldError问题
嘿,作为Django新手遇到这个问题很正常,咱们来一步步搞定它!
首先,先明确你的需求:从URL的捕获组里拿到Story模型的主键,然后过滤出Post数据库中关联这个Story的所有帖子(因为Story和Post是一对多关系)。你遇到的FieldError: Cannot resolve keyword 'name' into field,本质是你在筛选的时候用了一个不存在的字段名,或者字段关联的写法不对。
第一步:先确认你的模型结构
首先要确保Post模型里有正确的外键关联到Story,比如应该是这样的:
from django.db import models class Story(models.Model): # 你的Story字段,比如标题、内容等 title = models.CharField(max_length=200) # ...其他字段 class Post(models.Model): # 这里的`story`是外键字段名,你可以根据自己的命名调整,但后面筛选要对应 story = models.ForeignKey(Story, on_delete=models.CASCADE) content = models.TextField() # ...其他字段
第二步:检查你的URL配置
确保URL里正确捕获了Story的主键,比如:
# urls.py from django.urls import path from .views import PostByStoryListView urlpatterns = [ path('story/<int:story_pk>/', PostByStoryListView.as_view(), name='story-posts'), ]
这里的<int:story_pk>就是我们要从URL里获取的Story主键值。
第三步:修正你的类视图代码
你之前参考官方文档的思路是对的,但错误出在get_queryset方法里的筛选条件。正确的写法应该是利用Post模型里的外键字段,关联到Story的主键:
# views.py from django.views.generic import ListView from .models import Post, Story class PostByStoryListView(ListView): model = Post template_name = 'your_post_template.html' # 替换成你的模板路径 context_object_name = 'posts' # 模板里用来遍历帖子的变量名 def get_queryset(self): # 从URL的捕获组中获取story_pk story_pk = self.kwargs.get('story_pk') # 关键在这里:用Post的外键字段(比如`story`)关联Story的主键 # 两种写法都可以: return Post.objects.filter(story__pk=story_pk) # 或者直接用外键的_id后缀,更高效: # return Post.objects.filter(story_id=story_pk) # 可选:如果你想把对应的Story对象传到模板里展示,可以重写这个方法 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) story_pk = self.kwargs.get('story_pk') context['current_story'] = Story.objects.get(pk=story_pk) return context
为什么会出现那个错误?
你之前的代码里应该是写了类似filter(name=...)的语句,但Post模型里根本没有name这个字段,或者你想引用Story的字段但没写对关联方式(比如如果是按Story的name筛选,应该写成story__name=xxx,但你现在要的是主键,所以应该用story__pk或者story_id)。
最后验证一下
在你的模板里,就可以直接用{{ current_story.title }}展示当前Story的标题,用{% for post in posts %}遍历所有关联的帖子啦!
内容的提问来源于stack exchange,提问作者Emma Jane
相关产品推荐
相关产品推荐

