如何从指定数据库变量获取数据?并实现基于Django VideoLibrary模型的店铺名匹配地址查询功能
解答你的两个Django相关技术需求
一、从指定数据库变量中获取数据
首先得明确,在Django里你说的“指定数据库变量”,其实一般指的是模型对应的数据库记录或者查询集(QuerySet)。咱们分几种常见场景来说:
1. 单条记录精准获取
如果你知道要获取的记录的唯一标识(比如shop_id),可以用get()方法直接拿到模型实例,然后访问对应的字段值:
# 从VideoLibrary模型中获取shop_id为1的记录 try: video_lib = VideoLibrary.objects.get(shop_id=1) # 提取所需字段值 shop_name = video_lib.shop_name address = video_lib.adress # 注意你的模型里字段名是adress(少了一个d),别写错! except VideoLibrary.DoesNotExist: # 处理找不到记录的情况 print("该店铺记录不存在")
2. 多条记录过滤查询
如果要根据某个字段筛选一批记录,用filter()方法得到QuerySet,再按需遍历或处理:
# 获取所有店铺名称包含"生鲜"的记录 shops = VideoLibrary.objects.filter(shop_name__contains="生鲜") for shop in shops: print(f"店铺名:{shop.shop_name},地址:{shop.adress}")
3. 多数据库场景指定连接
如果你的项目配置了多个数据库,要从特定库获取数据,只需在查询时加上using()参数:
# 从名为"store_db"的数据库中获取记录 video_lib = VideoLibrary.objects.using("store_db").get(shop_id=1)
二、实现点击按钮匹配店铺名称并展示地址的功能
这个功能需要前后端配合,咱们分三步落地:
1. 编写后端视图函数
先写一个处理查询请求的视图,接收前端传来的店铺名称,查询对应地址并返回JSON响应:
# views.py from django.http import JsonResponse from .models import VideoLibrary def get_shop_address(request): if request.method == "POST": shop_name = request.POST.get("shop_name", "").strip() if not shop_name: return JsonResponse({"status": "error", "message": "请输入店铺名称"}) try: # 假设店铺名称唯一,若存在重名可改用filter().first()取第一条 shop = VideoLibrary.objects.get(shop_name=shop_name) return JsonResponse({ "status": "success", "address": shop.adress }) except VideoLibrary.DoesNotExist: return JsonResponse({"status": "error", "message": "未找到该店铺"}) # 仅支持POST请求 return JsonResponse({"status": "error", "message": "请求方式错误"})
2. 配置URL路由
把上面的视图映射到一个可访问的URL,让前端能发起请求:
# urls.py from django.urls import path from . import views urlpatterns = [ # 其他已有路由... path("get-shop-address/", views.get_shop_address, name="get_shop_address"), ]
3. 编写前端交互模板
创建一个模板文件(比如shop_search.html),包含文本域、查询按钮和结果展示区,用原生JS处理点击事件和AJAX请求:
<!-- templates/shop_search.html --> <!DOCTYPE html> <html> <head> <title>店铺地址查询</title> </head> <body> <h3>店铺地址查询工具</h3> <div> <label>店铺名称:</label> <!-- 按需求使用文本域 --> <textarea id="shopNameInput" rows="1" cols="30"></textarea> <button id="searchBtn">查询地址</button> </div> <div id="resultArea" style="margin-top: 20px; padding: 10px; border: 1px solid #eee;"></div> <script> const searchBtn = document.getElementById('searchBtn'); const shopNameInput = document.getElementById('shopNameInput'); const resultArea = document.getElementById('resultArea'); searchBtn.addEventListener('click', async () => { const shopName = shopNameInput.value.trim(); if (!shopName) { resultArea.innerHTML = '<span style="color: #dc3545;">请输入店铺名称</span>'; return; } try { const response = await fetch('{% url "get_shop_address" %}', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRFToken': '{{ csrf_token }}' // Django必须的CSRF令牌 }, body: `shop_name=${encodeURIComponent(shopName)}` }); const data = await response.json(); if (data.status === 'success') { resultArea.innerHTML = `<strong>匹配到的地址:</strong> ${data.address}`; } else { resultArea.innerHTML = `<span style="color: #dc3545;">${data.message}</span>`; } } catch (error) { resultArea.innerHTML = '<span style="color: #dc3545;">查询出错,请稍后重试</span>'; console.error(error); } }); </script> </body> </html>
额外提醒
- 你的模型里地址字段名是
adress(少了一个字母d),代码里一定要和模型保持一致,别写成address,否则会抛出字段不存在的错误! - 如果存在多个同名店铺,
get()方法会触发MultipleObjectsReturned异常,这时候可以改成VideoLibrary.objects.filter(shop_name=shop_name).first(),或者在前端提示用户“店铺名称不唯一,请输入更精确的名称”。
内容的提问来源于stack exchange,提问作者unhaten




