Django3 个人开发笔记

Django 查询优化方法的简单示例:

  1. 使用 defer() 推迟加载某些字段:

    # 假设有个模型 Article,其中 content 是一个文本字段
    queryset = Article.objects.defer("content")
    for article in queryset:
        print(article.title)  # 不会立刻加载 content 字段
        print(article.content)  # 在这里访问时才会从数据库加载 content 字段
    
  2. 使用 only() 只加载特定字段:

    # 只加载 Article 模型中 title 和 summary 字段
    queryset = Article.objects.only("title", "summary")
    for article in queryset:
        print(article.title)
        print(article.summary)  # 这两个字段已经加载
        print(article.content)  # 访问其他字段会导致额外的数据库查询
    
  3. 使用 select_related() 优化外键查询:

    # 假设 Article 模型有一个外键指向 Author
    queryset = Article.objects.select_related("author")
    for article in queryset:
        print(article.author.name)  # 不会产生额外的数据库查询
    
  4. 使用 prefetch_related() 优化多对多或一对多关系的查询:

    # 假设 Article 模型有一个多对多关系 tags
    queryset = Article.objects.prefetch_related("tags")
    for article in queryset:
        print([tag.name for tag in article.tags.all()])  # 不会为每篇文章产生额外的数据库查询
    
  5. 在模型中添加数据库索引:

    # models.py 文件中定义模型字段并添加索引
    class Article(models.Model):
        title = models.CharField(max_length=100, db_index=True)  # 添加数据库索引
        content = models.TextField()
    
  6. 使用缓存:

    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})
    
  7. 使用 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字段)
    

请注意,代码示例假定已存在适当的模型定义,并且您已根据需要配置了相应的数据库。此外,查询优化方法的效果可能因实际数据和查询情况而异,所以在实际使用中应根据具体场景来选择最佳方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franciz小测测

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值