掌握Django ORM精髓,以Oracle经典emp与dept表为舟,扬帆数据海洋,开启高效开发之旅

文章导读
首先,创建Django模型对应Oracle经典emp和dept表:from django.db import modelsclass Dept(models.Model): deptno = models.IntegerField(primary_key=True) dname = models.CharField(max_length=14) loc = models.Char
📋 目录
  1. A 环境搭建与连接配置
  2. B 基础查询操作
  3. C 高级聚合与分组
  4. D 多表联查与外键优化
  5. E 更新与删除操作
  6. F FAQ
A A

首先,创建Django模型对应Oracle经典emp和dept表:
from django.db import models
class Dept(models.Model):
deptno = models.IntegerField(primary_key=True)
dname = models.CharField(max_length=14)
loc = models.CharField(max_length=13)
class Emp(models.Model):
empno = models.IntegerField(primary_key=True)
ename = models.CharField(max_length=10)
job = models.CharField(max_length=9)
mgr = models.IntegerField(null=True, blank=True)
hiredate = models.DateField(null=True, blank=True)
sal = models.DecimalField(max_digits=7, decimal_places=2)
comm = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
deptno = models.ForeignKey(Dept, on_delete=models.CASCADE)
高效查询示例:Emps.objects.filter(deptno__dname='SALES').select_related('deptno').values('ename', 'sal')

环境搭建与连接配置

在settings.py中配置Oracle数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'xe',
'USER': 'scott',
'PASSWORD': 'tiger',
'OPTIONS': {
'threaded': True,
},
}
}
安装cx_Oracle驱动,确保Django能直连经典emp/dept表,扬帆起航!

基础查询操作

使用Django ORM查询emp表所有员工:Emps.objects.all()
按部门过滤:Emps.objects.filter(deptno=10)
关联查询部门:Dept.objects.get(deptno=20)
这些操作让数据海洋一览无余,高效开发从简单查询开始。

掌握Django ORM精髓,以Oracle经典emp与dept表为舟,扬帆数据海洋,开启高效开发之旅

高级聚合与分组

计算每个部门平均薪资:from django.db.models import Avg; Dept.objects.annotate(avg_sal=Avg('emp__sal'))
员工薪资最高最低:Emps.objects.aggregate(Max('sal'), Min('sal'))
以emp/dept为舟,掌握聚合函数,数据分析如鱼得水。

掌握Django ORM精髓,以Oracle经典emp与dept表为舟,扬帆数据海洋,开启高效开发之旅

多表联查与外键优化

select_related预加载外键避免N+1:Emps.objects.select_related('deptno').filter(deptno__loc='NEW YORK')
prefetch_related多对多:但这里emp-dept是一对多,用select_related完美。
开启高效之旅,ORM精髓就在优化这些关联查询。

更新与删除操作

批量更新:Emps.objects.filter(job='CLERK').update(sal=3000)
复杂更新用Q对象:from django.db.models import Q; Emps.objects.filter(Q(sal__lt=2000) | Q(comm__isnull=True)).update(comm=0)
删除:Emps.objects.filter(empno=7369).delete()
安全高效,数据海洋稳操胜券。

掌握Django ORM精髓,以Oracle经典emp与dept表为舟,扬帆数据海洋,开启高效开发之旅

FAQ

Q: 如何处理Oracle日期字段在Django中的问题?
A: 使用models.DateField(null=True),hiredate兼容性好。
Q: emp表的mgr自引用怎么建模?
A: mgr = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL)
Q: 性能慢怎么优化?
A: 用select_related和only('字段')限制字段。
Q: 事务怎么用?
A: from django.db import transaction; with transaction.atomic(): 操作
Q: 中文支持?
A: 确保Oracle字符集为AL32UTF8,Django默认UTF8无忧。