2011-05-01 43 views
20

这一个现在正在让我疯狂。之前没有发生过(因为客户需要它,所以我必须为用户手册做必要的截图)。当试图编辑/创建时,Django管理员挂起(直到超时错误)特定模型

我第一次注意到它在生产服务器上,然后我检查,也发生在Django附带的开发服务器。该模型出现在django管理员的主页上,我可以点击它并显示销售点列表。每当我想编辑现有的实例或创建一个新的实例时,都会出现这个问题。

我只是点击链接(或放在吧台),它只是挂起。

class PointOfSaleAdmin(admin.ModelAdmin): 
    list_display = ('id','business', 'user', 'zipcode', 'address','date_registered') 
    list_filter = ('business',) 
    filter_horizontal = ('services',) 
admin.site.register(models.PointOfSale, PointOfSaleAdmin) 

这就是模型的注册。所有模型都在管理员应用程序中注册并且用户测试这是一个超级用户。该模型是:

class PointOfSale(models.Model): 
    user = models.ForeignKey(User) 
    zipcode = models.ForeignKey(Zipcode) 
    business = models.ForeignKey(Business) 
    services = models.ManyToManyField(Service, 
     verbose_name='available services') 
    date_registered = models.DateField(auto_now_add=True) 
    address = models.CharField(max_length=300) 

再加上几个方法,应该没什么关系。另外,在我创建所有这些方法之后,我测试管理员的权利之前的最后时间,所以这应该不重要。

管理员很少必须访问此页面。通常它只是列出了PoS,但它仍然困扰着我。任何想法为什么它可以挂?所有其他型号都可以正常工作。

这是发生在两个Django的1.2.5和1.3

编辑:

我修改了超时限制。它正在工作,但不知何故它需要几分钟才能真正发生。所以,背景中有些东西需要时间。我不明白怎么就只发生这种模式,它在不同的环境发生(与小数据集)


我几乎觉得自己打耳光。我的错不睡这么久。

问题是,邮政编码列表相当大(几十万),外键字段作为html选择标签加载,这意味着它加载每一个条目。简单来说,这是一个有多少数据的问题。

现在我不知道如何控制外键在管理中显示的方式。任何人都可以帮忙吗?

+1

有趣的问题与一个有趣的答案。我在上个月内已经犯了这个错误 - 用大数据集测试你的应用程序,因为当你相信你已经测试了所有东西时,跟踪这样的问题并不明显。 – 2011-05-01 21:40:54

回答

24

在你admin.py文件,相应的管理类下,设置

raw_id_fields = ('zipcode',) 

这将显示邮政编码的PK,而不是一个下拉的。

是否有理由设置邮编,因为它是自己的模型,而不是使用CharField或实际的邮编modelfield

+1

我从来没有用过这些说实话。使用邮编作为模型是因为我得到了所有的坐标(经度和纬度),我用它来显示(在GMap中)销售点位于美国各地。谢谢! – Mamsaac 2011-05-01 15:22:41

+1

不够公平。只是想确保没有更好的解决方案。 – spulec 2011-05-01 15:25:37

+0

顺便说一句,我最终结束了使用django_extension中的一些东西,它向管理员提供了自动完成功能。可怕的文档并没有按照我想要的那样做,但我修改了一个很多的代码,并使其行为 对。 – Mamsaac 2011-05-01 16:25:52

0

你有没有试过检查Apache日志(如果你明显使用Apache)或任何其他HTTP服务器相关的日志?这可能会让你知道从哪里开始。

这是唯一受影响的型号?你提到了模型上的方法。尝试注释掉这些方法并再次尝试(包括__unicode__方法),以查看它们是否以某种方式影响它。把所有东西都降到最低限度(尽可能显而易见),试着推断回归开始的地方。

尝试在请求此页面时监视服务器资源。 CPU是否会急剧上升?关于网络I/O呢?可能是数据库问题(以某种方式?)。

对不起,这并不能真正回答你的问题,但这些是我试图尝试诊断问题的第一种调试技术。

+0

我检查了日志。我正在使用Apache/WSGI。没有错误,除了一些deprecationwarnings(但这些来自Django,我证实它与这个问题无关)。我将所有模型中的所有Admin属性(注意,在admin.py文件中)都带走,然后再次尝试,结果没有成功。所以,我在考虑它可能在models.py中,但我没有发现任何可疑的东西:(没有CPU高峰,我没有检查,我认为它肯定是一个数据库问题,确实如此:S并且非常感谢!我会检查更多的db – Mamsaac 2011-05-01 12:50:25

+0

我不记得这么做了,但是如果我改变了模型而没有手动改变表格结构,那么这可能是原因么? – Mamsaac 2011-05-01 12:53:13

5

我只是想补充说,这里的另一个选项是创建一个read_only_fields列表。在与具有大量选择的模型有关系的情况下(在我的情况下,在大量用户和讨论线索之间的rel表编目标记),但是不需要编辑该字段。您可以将其添加到read_only_fields列表中,只会打印值而不是选项。

class FlaggedCommentsAdmin(ModelAdmin): 
    list_display = ('user', 'discussion', 'flagged_on') 
    readonly_fields = ('user', 'discussion') 
相关问题