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

Django无法查询数据库中已存在的数据问题求助

问题分析与修复方案

核心原因:请求参数带多余引号

从终端输出可见,你的query值是"http://shooka.com"(包含首尾双引号),但数据库中对应的serial_number是http://shooka.com(无引号),两者无法匹配,导致get_object_or_404触发404响应。

其他问题与修复步骤

1. 修正请求参数解析方式

前端AJAX POST通常发送JSON格式数据,直接解码request.body会保留原始引号,应该用json模块解析请求体:

import json

@csrf_exempt
def products(request):
    if request.method == 'POST':
        # 解析JSON格式的请求体
        data = json.loads(request.body.decode('utf-8'))
        query = data.get('serial_number', '')  # 假设前端传参的键为serial_number
        # ...后续逻辑

2. 修正get_object_or_404的用法

get_object_or_404的第一个参数必须是模型类,而非queryset(你当前传入的products是Products.objects.all()的查询集结果),正确写法:

# 错误写法
# get_object_or_404(products, serial_number=query)

# 正确写法
target_product = get_object_or_404(Products, serial_number=query)

3. 适配AJAX请求的响应格式

前端是AJAX请求,返回HTML模板不符合预期,应返回JSON格式的产品详情:

from django.http import JsonResponse

# 获取到target_product后
return JsonResponse({
    'prod_name': target_product.prod_name,
    'serial_number': target_product.serial_number,
    'comments': target_product.comments,
    'pub_date': target_product.pub_date.strftime('%Y-%m-%d %H:%M:%S')
})

4. 临时兼容:清理多余引号

如果暂时无法修改前端请求格式,可以先清理query的首尾引号做兼容:

query = query.strip('"')

完整修复后的视图代码

import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from products.models import Products 
from django.shortcuts import get_object_or_404

@csrf_exempt
def products(request):
    if request.method == 'POST':
        try:
            data = json.loads(request.body.decode('utf-8'))
            query = data.get('serial_number', '').strip('"')  # 双重保险清理引号
            target_product = get_object_or_404(Products, serial_number=query)
            return JsonResponse({
                'status': 'success',
                'data': {
                    'prod_name': target_product.prod_name,
                    'serial_number': target_product.serial_number,
                    'comments': target_product.comments,
                    'pub_date': target_product.pub_date.strftime('%Y-%m-%d %H:%M:%S')
                }
            })
        except json.JSONDecodeError:
            return JsonResponse({'status': 'error', 'message': '无效的JSON格式'}, status=400)
    else:
        return JsonResponse({'status': 'error', 'message': '仅支持POST请求'}, status=405)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:20:21