You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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之后,会触发未定义引用错误。
修复方案
  1. 修正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()
  1. 修正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)
  1. 调整序列化器定义顺序,保证被依赖的ImageSerializer定义在PortfolioSerializer之前,你的现有代码顺序已经符合要求,仅需注意后续调整时不要乱序即可。

内容的提问来源于stack exchange,提问作者Paul Bénateau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:36:04