Django返回序列化QuerySet时报AttributeError: 'int' object has no attribute 'pk'错误
报错原因分析
get_queryset方法返回值不符合DRF规范:DRF的ModelViewSet要求get_queryset必须返回Django QuerySet对象,而非序列化后的Python数据结构。你在方法内部提前完成了序列化操作后返回ser.data,后续框架处理时会尝试从返回的每条数据中提取pk属性执行后续逻辑,但序列化后的data里的id/pk是int类型的原生值,自然会抛出'int' object has no attribute 'pk'的错误。- 模型定义存在逻辑错误:
Image模型的portfolio外键字段错误指向了Image自身,按照业务逻辑应该指向Portfolio模型,否则后续反向查询关联images字段时会出现逻辑错乱。 - 序列化器定义顺序存在隐患:当前代码中
PortfolioSerializer引用了ImageSerializer,如果ImageSerializer定义在PortfolioSerializer之后,会触发未定义引用错误。
修复方案
- 修正
get_queryset方法,直接返回过滤后的QuerySet即可,序列化操作由DRF框架自动完成:
class PortfolioViewSet(viewsets.ModelViewSet): serializer_class = serializers.PortfolioSerializer queryset = models.Portfolio.objects.all() permission_classes = (permissions.IsAuthenticated, core_permissions.IsMineOnly) def get_queryset(self): return self.request.user.portfolio_set.all()
- 修正
Image模型的外键关联指向:
class Image(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) # 将外键指向从Image修改为Portfolio portfolio = models.ForeignKey(Portfolio, related_name="images", on_delete=models.CASCADE) thumb = models.URLField(blank=True, null=True)
- 调整序列化器定义顺序,保证被依赖的
ImageSerializer定义在PortfolioSerializer之前,你的现有代码顺序已经符合要求,仅需注意后续调整时不要乱序即可。
内容的提问来源于stack exchange,提问作者Paul Bénateau
相关产品推荐
相关产品推荐

