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

Django关联多模型查询返回JSON序列化及分页报错问题求助

解决Django DRF中关联模型数据序列化返回问题

核心问题分析

你之前的错误根源在于错误地在get_queryset方法中直接返回JsonResponse——DRF的Generic视图体系中,get_queryset的职责是返回过滤后的QuerySet对象,而非直接生成响应。另外手动循环拼接数据不仅容易引发序列化错误,还会导致N+1数据库查询性能问题。

正确解决方案:使用嵌套序列化器+DRF视图流程

1. 编写嵌套序列化器

利用DRF的序列化器嵌套功能,直接在商品序列化器中关联图片序列化器,自动处理关联数据:

from rest_framework import serializers
from .models import Product, ProductImages

# 图片序列化器,自定义返回图片URL
class ProductImagesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductImages
        fields = ['image_url']
    
    # 自定义字段返回图片URL
    image_url = serializers.SerializerMethodField()
    def get_image_url(self, obj):
        return obj.image.url if obj.image else None

# 商品列表序列化器,嵌套图片序列化器
class ProductListSerializer(serializers.ModelSerializer):
    # 利用模型中定义的related_name关联图片
    product_imgs = ProductImagesSerializer(many=True, read_only=True)

    class Meta:
        model = Product
        fields = ['id', 'title', 'details', 'slug', 'product_imgs']

2. 修正视图逻辑

get_queryset只负责过滤QuerySet,序列化和响应交给DRF自动处理,同时用prefetch_related优化查询避免N+1问题:

from rest_framework.generics import ListAPIView
from .models import Product, ProductCategory
from .serializers import ProductListSerializer

class ProductListView(ListAPIView):
    serializer_class = ProductListSerializer

    def get_queryset(self):
        # 预加载关联图片,避免循环查询数据库
        qs = Product.objects.all().prefetch_related('product_imgs')
        
        # 处理GET参数过滤
        if 'category' in self.request.GET:
            category_id = self.request.GET['category']
            category = ProductCategory.objects.get(id=category_id)
            qs = qs.filter(category=category)
        
        if 'owner' in self.request.GET:
            owner = self.request.GET['owner']
            qs = qs.filter(owner=owner)
            if 'available' in self.request.GET:
                available = self.request.GET['available'] == 'true'
                qs = qs.filter(available=available)
        
        return qs

为什么之前的方案出错?

  • 方案一:手动拼接图片数据后又用序列化器处理商品,导致数据结构混乱,且没有遵循DRF视图流程。
  • 方案二:get_queryset返回了普通列表而非QuerySet,DRF的分页器无法对非QuerySet对象进行正确的切片处理,从而引发unhashable type: 'slice'错误。

额外优化点

  • 确保Product模型中存在category和owner字段(你代码中用到但模型定义未体现)。
  • 若category是外键,可搭配select_related进一步优化查询性能。

内容的提问来源于stack exchange,提问作者user22257988

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:45:07