Django models.Meta.ordering与ModelAdmin.ordering&;恩达什;如何在Meta.ordering测试后回收性能?

Django models.Meta.ordering与ModelAdmin.ordering&;恩达什;如何在Meta.ordering测试后回收性能?,django,sorting,django-models,django-admin,Django,Sorting,Django Models,Django Admin,设置 我有两个Django(1.4.2)模型,如下所示: class CoreData(models.Model): cdid = models.AutoField(primary_key=True,editable=False) name = models.CharField(max_length=100,db_index=True,unique=True) # etc class DetailData(models.Model): cdid = models.On

设置

我有两个Django(1.4.2)模型,如下所示:

class CoreData(models.Model):
   cdid = models.AutoField(primary_key=True,editable=False)
   name = models.CharField(max_length=100,db_index=True,unique=True)
   # etc

class DetailData(models.Model):
    cdid = models.OneToOneField(CoreData,primary_key=True)
    detl = models.CharField(max_length=100)
    # etc
class CoreData(models.Model):
    cdid = models.AutoField(primary_key=True,editable=False)
    name = models.CharField(max_length=100,db_index=True,unique=True)
    # etc
    class Meta:
        ordering = ['name']

class DetailData(models.Model):
    cdid = models.OneToOneField(CoreData,primary_key=True)
    detl = models.CharField(max_length=100)
    # etc
    class Meta:
        ordering = ['cdid__name']
以及以下管理员定义:

class CoreDataAdmin(admin.ModelAdmin):
    ordering = ['name']
    readonly_fields = ('etc', )
admin.site.register(CoreData, CoreDataAdmin)

class DetailDataAdmin(admin.ModelAdmin):
    ordering = ['cdid__name']
    readonly_fields = ('etc', )
admin.site.register(DetailData, DetailDataAdmin)
在Django的管理界面中,这将导致在
CoreData
DetailData
的概述中进行预期的排序,换句话说,这两个列表都是按照
CoreData
名称字段的升序排序的

但是,没有排序的是
DetailData
条目页面上的下拉列表。它以升序
cdid
顺序列出

总有一天你会想改变这一切

出于本简化图范围之外的原因,我对模型进行了如下扩展:

class CoreData(models.Model):
   cdid = models.AutoField(primary_key=True,editable=False)
   name = models.CharField(max_length=100,db_index=True,unique=True)
   # etc

class DetailData(models.Model):
    cdid = models.OneToOneField(CoreData,primary_key=True)
    detl = models.CharField(max_length=100)
    # etc
class CoreData(models.Model):
    cdid = models.AutoField(primary_key=True,editable=False)
    name = models.CharField(max_length=100,db_index=True,unique=True)
    # etc
    class Meta:
        ordering = ['name']

class DetailData(models.Model):
    cdid = models.OneToOneField(CoreData,primary_key=True)
    detl = models.CharField(max_length=100)
    # etc
    class Meta:
        ordering = ['cdid__name']
我相信在我的第一次测试中,我在管理定义中保留了
顺序

观察

我所做的更改增加了Django测试服务器上的处理时间(按数量级)。即使是项目概述页面也是如此。我甚至看到过破裂的管道(我认为是由于浏览器重试),在修改之前几乎没有延迟。所有的CPU核心都没有受到影响;大概是由于数据库请求的急剧增加导致了速度的减慢。(这里我们不是说数万条DB记录,此外,受影响的管理项目概述页面显示的项目数量有限。)

到目前为止,一切都很好:如果我能恢复这种效果就好了。但即使回到最初的定义,也不能改善这种情况

问题

  • 如何恢复测试服务器的“旧”性能?我需要清理哪里?我回到了最初的定义,尝试了一些
    manage.py
    命令(希望不大,但谁知道呢),但没有任何结果。DB结构不受影响;那里没有什么变化
  • 有没有关于这两个
    有序的
    机制应该如何互操作的文档?到目前为止还没有发现
  • 你在这方面还有什么其他的经验,或者每个人都只是在使用

如果您还没有使用它,您应该查看django调试工具栏。它显示每个页面加载的SQL。这是一个5分钟的工作,添加到您的项目-@AidanEwen谢谢,是时候我安装这样的东西了。谢谢你的指点!效果很好。你好,可爱的康沃尔,也是@AidanEwen为了记录在案,Django调试工具栏0.9.4和Django 1.4.2有时会(我没有机会检查确切的条件;它在一种情况下是确定的,而不是在另一种情况下)破坏自定义Django模型字段的
to_python()
/
get_prep_value()
逻辑(不是针对项目列表,而是针对项目编辑表单)。--除此之外,它非常棒。我没有遇到过这种情况。实际上我自己刚刚开始使用工具栏-它非常酷,我觉得我需要告诉大家。我一定会转达你对康沃尔的问候。(我相信康沃尔很快会再次见到你)。