我正在try 使用原始的MySQL查询获取数据库的记录总数,并将其呈现在一个类似于{{ number_of_rec }}的html模板中

到目前为止,我已经try 过:

View.py

def number_of_rec(request):

    locate = Record.objects.raw("SELECT count(*) FROM mydb ")
    number_of_rec = len(locate.fetchall)
    return render(request, 'test.html', {'number_of_rec': number_of_rec})

但它不起作用,因为模板html中的{{ number_of_rec }}不返回任何内容.

我也试了number_of_rec = len(locate.fetchall)[0]次,但没有变化.

我做错了什么?

推荐答案

你不能像那样用.raw(…) [Django-doc]美元..raw(…)期望它是一个如模型所期望的那样返回列的查询.但在这里,您的查询将返回一行和一列.

您可以使用以下命令处理原始查询:

from django.db import connection


def number_of_rec(request):
    with connection.cursor() as cursor:
        cursor.execute('SELECT count(*) FROM mydb')
        number_of_rec = cursor.fetchone()[0]
    return render(request, 'test.html', {'number_of_rec': number_of_rec})

但一般而言,使用原始查询通常不是一个好主意.如果您想要计算Record的数量,您可以使用:

def number_of_rec(request):
    number_of_rec = Record.objects.count()
    render(request, 'test.html', {'number_of_rec': number_of_rec})

但是,由于您不通过该视图触发模板,因此逻辑永远不会呈现.

我们可以通过以下几点来定义context processor [Django-doc]:

# app_name/context_processors.py

from django.conf import settings


def number_of_rec(request):
    with connection.cursor() as cursor:
        cursor.execute('SELECT count(*) FROM mydb')
        number_of_rec = cursor.fetchone()[0]
    return {'number_of_rec': number_of_rec}

并向以下位置注册上下文处理器:

# settings.py

TEMPLATES = [
    {
        # …,
        'context_processors': ['app_name.context_processors.number_of_rec']
    },
]

Mysql相关问答推荐

括号在SQL查询中的作用?

更新MySQL表中子记录的序号

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

默认情况下,MariaDB是否限制为本地主机?

MySQL 计数出现的百分比大于

使用mysql查询获取不关注user1的user3

根据名称将值从一个字段复制到不同记录的同一字段

Mysql根据文本语言或行数将列拆分为多列

为什么order by子句可以利用索引?

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

访问 nodejs、mysql 和 json 中的嵌套对象数组

查询以从约会表中获取可用空档

查找同时玩过这两种游戏的玩家

MySQL如何通过外键ID Select 多行?

如何使主键从 1000 开始?

如何为 php 启用 mysqlnd?

你如何 OR 两个 LIKE 语句?

在 MySQL Workbench EER 图中的多个列上创建唯一约束

将 Blob 转换为字节数组的最简单方法

使用 mysqldriver 连接数据库时出错