设置数据库持久连接
DATABASES["default"] = env.db("DATABASE_URL")
DATABASES["default"]["ATOMIC_REQUESTS"] = True
# 第一次发送请求之后,后面60s的SQL连接都不需要再连接
DATABASES["default"]["CONN_MAX_AGE"] = env.int("CONN_MAX_AGE", default=60)
合理的创建索引
索引会占用磁盘空间,创建不必要的索引只会形成浪费
主键、外键、唯一键已经建立索引
- 频繁出现在where条件子句的字段 ==> get() filter()
- get()请求返回的大多是一个对象,也就是查询的是主键或者唯一键,就不需要建立索引
- filter()查询的时候,有些是布尔类型,有些是带choice的字段,也不需要
 
- 经常被用来分组(greoup by)或排序(order_by)的字段 ==> db_index=True
- 在元数据中定义的orering()
 
- 用于联接的列(主键、外键)上建立索引
- 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定
减少SQL语句的执行次数
把两个SQL查询,变成一个查询语句,一次查询返回结果
- select_related():ForeignKey、OneToOneField
- prefetch_related():ManyToManyField、GenericForeignKey(通用外键)
# 网站的所有内容要求用户登录后才能看到 ==> LoginRequiredMixin
class NewsListView(LoginRequiredMixin, ListView):
    """首页动态"""
    model = News
    paginate_by = 20  # 分页:url中的?page=
    template_name = "news/news_list.html"  # 默认: '模型类名_list.html'
    def get_queryset(self):
        """
        获取视图的对象列表, 实现动态过滤
        :return: django查询集
        """
        return News.objects.filter(reply=False)
            .select_related('user', 'parent')
                .prefetch_related('liked')
@login_required
@ajax_required
@require_http_methods(["GET"])
def get_thread(request):
    """返回动态的评论,AJAX GET请求"""
    news_id = request.GET['news']
    # 不是.get(pk=news_id).select_related('user')
    news = News.objects.select_related('user').get(pk=news_id)
    # render_to_string()表示加载模板,填充数据,返回字符串
仅获取需要的字段数据
- 在ORM查询后面添加
- defer():排除掉一些字段
- only():只获取某些字段
 
使用批量创建、更新和删除
- Aqw.objects.bull_create():bull_create()批量创建
不随意对结果排序
- 没必要排序的地方,不适用ordering()
 
             
           
             
                         
             
            
评论区