You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从指定数据库变量获取数据?并实现基于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

火山引擎 最新活动