Django中ManyToMany字段序列化问题:单条Submission返回空值
问题分析与解决
核心问题:get_object方法返回错误类型
你的SubmissionView中重写的get_object方法返回的是QuerySet(查询集合),而非单个Submission实例。ModelViewSet的get_object方法要求返回单个模型对象,当你返回QuerySet时,序列化器无法正确解析对象属性,导致所有字段返回null。
原错误代码:
def get_object(self): user = self.request.user return Submission.objects.prefetch_related('tags').filter(author=user)
修复方案
1. 修正get_object方法
从URL中提取pk参数,筛选出当前用户的单个Submission实例:
def get_object(self): user = self.request.user pk = self.kwargs.get('pk') return Submission.objects.prefetch_related('tags').get(author=user, pk=pk)
2. 修复序列化器关联标签的错误
在startSubmissionSerializer的create方法中,你错误调用了submission.tag.add(tag),但模型中ManyToMany字段的名称是tags,应改为:
submission.tags.add(tag)
此错误会导致标签无法正确关联到Submission实例。
3. 保留正确的查询集逻辑
你的get_queryset方法已经正确过滤当前用户的Submission并预取关联标签,无需修改:
def get_queryset(self): user = self.request.user return Submission.objects.prefetch_related('tags').filter(author=user)
修复后效果
调用submission/13接口时,会返回与列表接口中一致的完整数据,包括关联的tags列表。
内容的提问来源于stack exchange,提问作者Ayatoo
相关产品推荐
相关产品推荐

