Django Admin Model inline导致apache以100%CPU运行

时间:2014-04-02 15:12:40

标签: django python-2.7

我的django app中有这些模型:

class Route(models.Model):
    pass
class Link(models.Model):
    start = models.ForeignKey(Stop)
    runtime = models.TimeField()
    position = models.IntegerField()
    route = models.ForeignKey(Route)

以及这些管理模式:

class LinkInline(admin.TabularInline):
    model = Link
class RouteAdmin(admin.ModelAdmin):
    list_display = ('id', 'show_link_count')
    inlines = [
        LinkInline,
    ]

    def queryset(self, request):
        return Route.objects.annotate(link_count=Count('link'))

    def show_link_count(self, inst):
        return inst.link_count
    show_link_count.short_description = "Stop count"

当我尝试查看任何特定路由(并查看与其关联的链接列表)时,它会导致apache服务器在一个线程上运行100%并稳定地分配越来越多的内存。

我在这里做错了吗?

我使用django 1.6和apache 2.4.6运行Ubuntu 13.10

2 个答案:

答案 0 :(得分:0)

我猜你在Stop模型中有很多记录。解决方案是raw_id_fields内联链接。试试这个:

class LinkInline(admin.TabularInline):
    model = Link
    raw_id_fields = ('start',)

答案 1 :(得分:0)

正如波格丹所说,你的问题可能是由Stop的大量记录引起的。相反,使用raw_id_fields的方式,您可能仍希望明确查看Stop内联中的所有Link个实例。这可以实现,但它很复杂。

将您的Inline类更改为

class LinkInline(admin.TabularInline):
    model = Link
    form = LinkForm 

然后创建Linkform

Class LinkForm(forms.Form):
    start = Stop.objects.values_list('id', 'something')
    #I don't believe you just have an empty class

    def clean(self):
        cleaned_data = super(LinkForm, self).clean()
        cleaned_data['start'] = Stop.objects.get(id=cleaned_data['start'])
        return cleaned_data

在这种情况下,您仍然会加载Stop模型的所有实例,但也可以快速加载。

代码可能会混淆,如果您需要更多解释,请告诉我。