在 django 中处理原始查询
通过这个解释,我们将了解 raw()
方法的作用以及我们如何操作原始查询,我们还将学习如何在 django 的应用程序中注入 sql。
在 django 中使用 raw()
方法允许我们获取或构建 sql 查询并执行它们。但这不是在 django 中运行 sql 查询的唯一方法;除了使用默认的表单设置,如果我们愿意,我们还可以绕过表单并只运行 sql 查询。
但我们为什么提到这一点?因为当你想要执行原始 sql 查询时,模型管理器 raw()
方法通常应该是你的首选。
这是因为原始查询集类实例的结构与你一直在使用的查询集类实例的结构非常相似。我们可以在原始查询中执行其他操作,例如索引和切片。
所以让我们从一个非常简单的例子开始。让我们继续创建名为 student_data()
的新函数。
我们将在 models.py
文件中使用简单数据集和 student
模型。
class student(models.model):
first_name = models.charfield(max_length=100)
sr_name = models.charfield(max_length=100)
age = models.integerfield()
class_room = models.integerfield()
teacher = models.charfield(max_length=100)
def __str__(self):
return self.first_name
现在我们将回到 views.py
文件并创建一个名为 student_data()
的函数来演示原始 sql。
在函数内部,我们将使用 student.objects.all()
从 student 表中获取所有数据。这将返回该表中的所有学生数据并将其存储在 sd_data
中。
让我们打印这个对象。我们还将使用 connection.queries
,它将给出 sql 的输出和一些性能测量。
def student_data(request):
sd_data = student.objects.all()
print(sd_data)
print(connection.queries)
return render(request,'output.html',{'data': sd_data})
让我们继续运行服务器。浏览器会显示所有数据,然后在下面,我们可以看到我们得到了我们执行的 sql 查询。
让我们继续使用 raw()
方法创建一个等价物。因此,我们将再次使用 student
及其对象,但这次我们将使用 raw()
。
我们需要在这个方法中运行 sql 查询:select * from student_student
。
我们不需要选择所有这些单独的项目,因此我们可以使用星号选择所有表字段,然后下一个子句是 from
,这有助于查找表。然后我们将定义名为 student_student
的表名。
sd_data = student.objects.raw('select * from student_student')
让我们回到浏览器并刷新它。然后我们将看到我们正在使用 select
语句从数据库中返回这些项目。
现在我们将继续前进并稍微扩展它并选择一个单独的项目。为此,我们需要使用 where
子句;在一个空格之后,我们选择 age
属性并将其作为值 21
传递。
sd_data = student.objects.raw('select * from student_student where age=21')
让我们重新运行 django 服务器并刷新浏览器。然后我们将看到 sql 正在运行并从数据库中返回一个项目。
我们已经看到了如何将我们的 sql 注入 django 的 raw()
函数,以及我们如何对数据库执行操作。
在 django 文档中,如果你查看模型即时参考并通读,它将为你提供有关延迟模型的一些信息。术语延迟模型实例是指从查询发出的字段,直到我们按需加载它们。
要打印数据,我们需要指定要在输出中看到的数据,为此,我们需要使用 for
循环。
for d in student.objects.raw('select * from student_student'):
print(d)
如果我们重新运行它,请查看控制台,因为我们正在打印它并从表中返回三个名称。
你可以在找到更复杂的查询。例如,一个叫做制作查询集的概念意味着我们可以限制我们想要返回的对象的数量。
现在我们将声明一个名为 sql
的新变量,然后在其中存储 sql 查询并将其传递给 raw()
函数。在 raw()
函数之后,我们将通过切片对象来限制两行。
sql='select * from student_student'
sd_data = student.objects.raw(sql)[:2]
当我们查看输出时,它只是返回两行。
views.py
文件的完整源代码:
from django.shortcuts import render
from .models import student
from django.db import connection
def student_data(request):
sd_data = student.objects.all()
sql='select * from student_student'
sd_data = student.objects.raw(sql)[:2]
# for d in student.objects.raw('select * from student_student'):
# print(d)
print(sd_data)
# print(connection.queries)
return render(request,'output.html',{'data': sd_data})
我们在模板中使用了以下代码。
{{data}}
<hr/>
{% for i in data %}
<div>{{ i.first_name }} - {{ i.age }}div>
{% endfor %}
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
pandas dataframe dataframe.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:python
-
dataframe.shift() 函数是将 dataframe 的索引按指定的周期数进行移位。
python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:python
-
python pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:python
-
pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 dataframe 中。
pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:python
-
本教程介绍了如何在 pandas 中使用 dataframe.merge()方法合并两个 dataframes。
pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:python
-
本教程介绍了如何使用 python 中的 loc 和 iloc 从 pandas dataframe 中过滤数据。
在 python 中将 pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:python
-
了解如何在 python 中将 pandas 系列日期时间转换为字符串