connection.cursor() 与 models.objects.filter
在 Django 中操作数据库时,connection.cursor() 和 models.objects.filter 是两种不同的方式,各有特点和适用场景:
- models.objects.filter (ORM 方式)
特点:
基于 Django 的 ORM(对象关系映射)框架,无需直接编写 SQL 语句。
支持链式调用,可结合 Q 对象实现复杂查询(如 OR 条件)。
自动处理数据库兼容性和安全性(如防 SQL 注入)。
返回的是 QuerySet 对象,支持惰性查询和分页优化。
示例:
python
Copy Code
from app.models import Blog
# 简单查询
blogs = Blog.objects.filter(name='test').order_by('-ctime')
# 使用 Q 对象
from django.db.models import Q
blogs = Blog.objects.filter(Q(id=1) | Q(name__contains='django')):ml-citation{ref="5" data="citationList"}
- connection.cursor() (原生 SQL 方式)
特点:
直接执行原生 SQL 语句,适合复杂查询或 ORM 无法高效实现的场景。
需手动管理游标和连接,灵活性高但代码更底层。
需注意 SQL 注入风险,推荐使用参数化查询(如 cursor.execute(sql, [params]))。
示例:
python
Copy Code
from django.db import connection
with connection.cursor() as cursor:cursor.execute("SELECT * FROM blog_blog WHERE id = %s", [1]) rows = cursor.fetchall():ml-citation{ref="2,6" data="citationList"}
对比总结
对比项 models.objects.filter connection.cursor()
适用场景 常规查询、ORM 支持的操作 复杂 SQL、性能优化需求
安全性 自动防注入 需手动参数化处理
可维护性 高(代码与数据库解耦) 低(依赖具体数据库语法)
性能优化 支持 select_related 等优化 可直接优化 SQL 语句
建议:优先使用 ORM 方式,仅在 ORM 无法满足需求时使用原生 SQL。