Django orm高级用法以及查询优化
from django.db import connection
from myapp.models import MyModel
# 使用select_related进行单一外键的预加载
objects = MyModel.objects.select_related('foreign_key_field').all()
for obj in objects:
print(obj.foreign_key_field.some_field) # 不会产生额外的数据库查询
# 使用prefetch_related进行多对多或反向外键的预加载
objects = MyModel.objects.prefetch_related('many_to_many_field').all()
for obj in objects:
for related_obj in obj.many_to_many_field.all():
print(related_obj.some_field) # 不会产生额外的数据库查询
# 使用extra()进行自定义SQL查询
objects = MyModel.objects.extra(where=["date_field > '%s'" % date])
# 使用Q对象进行复杂查询
from django.db.models import Q
results = MyModel.objects.filter(Q(condition1=value1) | Q(condition2=value2))
# 使用annotate()进行聚合查询
from django.db.models import Count
results = MyModel.objects.annotate(Count('foreign_key_field'))
# 查看ORM生成的SQL查询
with connection.cursor() as cursor:
cursor.execute("SELECT query FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;")
print(cursor.fetchall())
这个例子展示了如何在Django ORM中使用select\_related, prefetch\_related, extra, Q对象, annotate以及原生SQL查询来优化数据库性能。这些方法可以帮助开发者写出更高效的数据库查询代码。
评论已关闭