在 Django 中,models
提供了一种高层次的抽象来与数据库进行交互,使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查(CRUD)操作。下面将详细介绍 Django 的 ORM(对象关系映射)操作如何对应到 MySQL 的 SQL 查询。
创建 (Create)
Django Models:
python
# 创建并保存一个新对象
new_entry = MyModel(field1='value1', field2='value2')
new_entry.save()
MySQL SQL:
sql
INSERT INTO myapp_mymodel (field1, field2) VALUES ('value1', 'value2');
读取 (Read)
获取单个对象
Django Models:
python
# 根据主键获取一个对象
entry = MyModel.objects.get(id=1)
MySQL SQL:
sql
SELECT * FROM myapp_mymodel WHERE id = 1;
获取多个对象
Django Models:
python
# 获取所有对象
entries = MyModel.objects.all()
# 使用过滤条件获取对象
filtered_entries = MyModel.objects.filter(field1='value1')
MySQL SQL:
sql
-- 获取所有对象
SELECT * FROM myapp_mymodel;
-- 使用 WHERE 子句过滤
SELECT * FROM myapp_mymodel WHERE field1 = 'value1';
聚合查询
Django Models:
python
from django.db.models import Count
# 统计总数
count = MyModel.objects.count()
# 分组统计
grouped = MyModel.objects.values('field1').annotate(count=Count('id'))
MySQL SQL:
sql
-- 统计总数
SELECT COUNT(*) FROM myapp_mymodel;
-- 分组统计
SELECT field1, COUNT(id) AS count FROM myapp_mymodel GROUP BY field1;
更新 (Update)
Django Models:
python
# 更新单个对象
entry = MyModel.objects.get(id=1)
entry.field1 = 'new_value'
entry.save()
# 批量更新
MyModel.objects.filter(field1='old_value').update(field1='new_value')
MySQL SQL:
sql
-- 更新单个对象
UPDATE myapp_mymodel SET field1 = 'new_value' WHERE id = 1;
-- 批量更新
UPDATE myapp_mymodel SET field1 = 'new_value' WHERE field1 = 'old_value';
删除 (Delete)
Django Models:
python
# 删除单个对象
entry = MyModel.objects.get(id=1)
entry.delete()
# 批量删除
MyModel.objects.filter(field1='value1').delete()
MySQL SQL:
sql
-- 删除单个对象
DELETE FROM myapp_mymodel WHERE id = 1;
-- 批量删除
DELETE FROM myapp_mymodel WHERE field1 = 'value1';
高级查询
Django 的 ORM 还支持更复杂的查询,例如联合查询、子查询等,这些都可以通过 Django 的 Q 对象和 F 表达式来实现。对于非常复杂的查询,如果 ORM 不足以满足需求,Django 还允许直接执行原始 SQL 查询:
python
from django.db import connection
def custom_sql(query, params=None):
with connection.cursor() as cursor:
cursor.execute(query, params)
return cursor.fetchall()
这使得您可以根据需要灵活地选择是使用 ORM 抽象还是直接编写 SQL 查询。
总之,Django 的 ORM 提供了一个强大而灵活的方式来与数据库交互,简化了数据访问层的开发工作,并且自动处理了许多底层细节,如事务管理、连接池等。同时,它也保持了足够的灵活性,以应对复杂的查询需求。