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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:50:28