Django models.Meta.ordering与ModelAdmin.ordering&;恩达什;如何在Meta.ordering测试后回收性能?
设置 我有两个Django(1.4.2)模型,如下所示: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
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()
逻辑(不是针对项目列表,而是针对项目编辑表单)。--除此之外,它非常棒。我没有遇到过这种情况。实际上我自己刚刚开始使用工具栏-它非常酷,我觉得我需要告诉大家。我一定会转达你对康沃尔的问候。(我相信康沃尔很快会再次见到你)。