小编Len*_*ena的帖子

如何使用Django的index_together进行查询和filter和order_by?

我在为查询构建正确的索引时遇到问题.
我有这样的模型:

from django.db import models  

class Record(models.Model):
    user = models.ForeignKey(User, db_index=True, related_name='records')
    action = models.ForeignKey(Action, db_index=True)
    time = models.DateTimeField(db_index=True, default=timezone.now)

    class Meta:
        index_together = (
            ('user', 'time'),
            ('action', 'user', 'time'),
        )
Run Code Online (Sandbox Code Playgroud)

如您所见,此模型有两个自定义索引.

如果我想获得与特定用户相关的所有记录,过滤方式time,我使用此查询:user.records.filter(time__gt=some_moment).它工作正常并使用第一个自定义索引(根据Django调试工具栏).

现在,在我的情况下,结果必须按顺序排序action.我用这个查询:user.records.filter(time__gt=some_moment).order_by('action').
但是,尽管存在适当的索引,但不使用它.

我究竟做错了什么?如何为此查询构建正确的索引?
Django版本= 1.8.4,应用了所有迁移,数据库后端= mysql.

UPD:有我的疑问:

SELECT *** FROM `appname_record`
  WHERE (`appname_record`.`user_id` = 1896158 AND 
  `appname_record`.`time` > '2015-10-19 06:39:30.992790') 
  ORDER BY `appname_record`.`action_id` ASC 
Run Code Online (Sandbox Code Playgroud)

有完整的django工具栏说明:

ID: 1  
SELECT_TYPE: SIMPLE  
TABLE: appname_record  
TYPE: ALL  
POSSIBLE_KEYS: 
   appname_record_user_id_3214bab8a46891cc_idx, appname_record_07cc694b …
Run Code Online (Sandbox Code Playgroud)

python mysql django indexing

5
推荐指数
2
解决办法
4260
查看次数

标签 统计

django ×1

indexing ×1

mysql ×1

python ×1