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

Django保存Plant模型后查询条目出现DoesNotExist错误求助

解决Django中保存模型后查询不到实例的问题

看起来你遇到的问题根源有两个:一是完全没必要重新查询数据库,二是你用绝对路径去匹配plantImage字段的值,而Django的ImageField/FileField默认存储的是相对MEDIA_ROOT的路径,不是你手动拼接的绝对路径。

最直接的解决方案:直接使用serializer返回的实例

当你调用plants_serializer.save()时,它已经返回了保存后的模型实例,完全不需要再去数据库里查一遍。这样既避免了查询错误,还能提升接口性能。

修正后的代码如下:

def post(self, request, *args, **kwargs):
    plants_serializer = PlantSerializer(data=request.data)
    if plants_serializer.is_valid():
        # 保存后直接获取已持久化的模型实例
        plant_instance = plants_serializer.save()
        # 用Django内置的方式获取文件绝对路径,避免手动拼接出错
        result = predict(plant_instance.plantImage.path)
        # 直接更新实例的classification字段
        plant_instance.classification = result
        plant_instance.save()
        # 返回更新后的完整数据(注意重新序列化实例)
        return Response(PlantSerializer(plant_instance).data, status=status.HTTP_201_CREATED)
    else:
        print('error', plants_serializer.errors)
        return Response(plants_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

为什么你原来的查询会失败?

Django的ImageField存储的是相对于MEDIA_ROOT的相对路径(比如images/sunflower.jpg),而你拼接的filename是完整的绝对路径(比如/home/xxx/PlantPharmacy/media/images/sunflower.jpg),用绝对路径去匹配字段值,自然查不到对应的实例。

如果你非要手动查询(不推荐这种冗余操作),应该用相对路径去匹配:

# 假设你的MEDIA_ROOT配置为../PlantPharmacy/media/,相对路径就是images/文件名
obj = Plants.objects.get(plantImage=f'images/{data.name}')

但这种方式不如直接用serializer返回的实例可靠,还要额外处理文件名重复、路径拼接错误等问题。

额外的注意事项

  1. 永远不要手动拼接文件路径,用plant_instance.plantImage.path可以直接获取文件的绝对路径,这是Django提供的最安全的方式。
  2. 确保你的PlantSerializer正确包含了plantImage和classification字段,且Plants模型的plantImage是ImageField类型,同时在settings里配置好了MEDIA_ROOT和MEDIA_URL。
  3. 如果你的predict函数支持直接处理内存中的文件对象,也可以直接用request.FILES['plantImage']传入,不一定非要先保存到磁盘(不过你的业务逻辑需要先存模型,所以用实例路径更合理)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:57:23