Django 查询优化方法的简单示例:
-
使用
defer()
推迟加载某些字段:# 假设有个模型 Article,其中 content 是一个文本字段 queryset = Article.objects.defer("content") for article in queryset: print(article.title) # 不会立刻加载 content 字段 print(article.content) # 在这里访问时才会从数据库加载 content 字段
-
使用
only()
只加载特定字段:# 只加载 Article 模型中 title 和 summary 字段 queryset = Article.objects.only("title", "summary") for article in queryset: print(article.title) print(article.summary) # 这两个字段已经加载 print(article.content) # 访问其他字段会导致额外的数据库查询
-
使用
select_related()
优化外键查询:# 假设 Article 模型有一个外键指向 Author queryset = Article.objects.select_related("author") for article in queryset: print(article.author.name) # 不会产生额外的数据库查询
-
使用
prefetch_related()
优化多对多或一对多关系的查询:# 假设 Article 模型有一个多对多关系 tags queryset = Article.objects.prefetch_related("tags") for article in queryset: print([tag.name for tag in article.tags.all()]) # 不会为每篇文章产生额外的数据库查询
-
在模型中添加数据库索引:
# models.py 文件中定义模型字段并添加索引 class Article(models.Model): title = models.CharField(max_length=100, db_index=True) # 添加数据库索引 content = models.TextField()
-
使用缓存:
from django.core.cache import cache def my_view(request): articles = cache.get('all_articles') if not articles: articles = Article.objects.all() cache.set('all_articles', articles, 60 * 15) # 缓存 15 分钟 return render(request, 'my_template.html', {'articles': articles})
-
使用
values()
和values_list()
获取字典或列表形式的查询集:# 使用 values() 获取包含字典的查询集 queryset_dict = Article.objects.values("id", "title") for article in queryset_dict: print(article["title"]) # 输出字典中的 title 字段 # 使用 values_list() 获取包含元组的查询集 queryset_tuple = Article.objects.values_list("id", "title") for article in queryset_tuple: print(article[1]) # 输出元组中的第二个元素(title字段)
请注意,代码示例假定已存在适当的模型定义,并且您已根据需要配置了相应的数据库。此外,查询优化方法的效果可能因实际数据和查询情况而异,所以在实际使用中应根据具体场景来选择最佳方案。