Django QuerySet无product属性错误:多批次查询序列化问题
问题解决方案
核心问题
你遇到的错误根源是:filter()返回的是QuerySet(多个对象的集合),但你的BatchSerializer默认是为序列化单个对象设计的。直接将QuerySet传入序列化器时,它会尝试从集合对象中读取单个对象的字段(比如product),自然会抛出属性不存在的错误。
另外,你的try-except逻辑完全无效——filter()方法永远不会触发Batch.DoesNotExist异常,只有get()方法才会抛出这个异常。
具体修复步骤
1. 修正视图函数的序列化器调用
实例化BatchSerializer时必须添加many=True参数,明确告诉序列化器要处理多个对象:
@api_view(['GET']) def getByProduct(request, product_name, format=None): batches = Batch.objects.filter(product=product_name) # 检查是否存在匹配的批次 if not batches.exists(): return Response(status=status.HTTP_404_NOT_FOUND) # 添加many=True处理多对象集合 serializer = BatchSerializer(batches, many=True) return Response(serializer.data, status=status.HTTP_200_OK)
2. 验证序列化器定义(必要时修正)
确保你的BatchSerializer是标准的ModelSerializer,没有错误定义字段:
from rest_framework import serializers from .models import Batch class BatchSerializer(serializers.ModelSerializer): class Meta: model = Batch fields = ['product', 'created', 'stock', 'expiration'] # 也可以用fields = '__all__'来包含所有模型字段
额外说明
- 你提到用
batches = Batch.objects.filter(pk=1)仍报错,原因和之前一致:哪怕QuerySet只有一个对象,它还是集合类型,必须加many=True;如果要处理单个对象,才用get(pk=1)。 - 第二个错误
Cannot resolve keyword 'many' into field,大概率是你之前误把many当成字段名写在序列化器的fields列表里了,检查序列化器的Meta类即可排除。
内容的提问来源于stack exchange,提问作者Sanjo
相关产品推荐
相关产品推荐

