在尝试编辑/创建时,Django管理员会挂起(直到超时错误)特定模型

Mam*_*aac 25 python django django-admin

这个让我现在疯了.之前没有发生过(因为客户需要它,我甚至得到了用户手册的截图).

我首先在生产服务器上注意到它然后我检查并且也发生在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)
Run Code Online (Sandbox Code Playgroud)

这是模型的注册.所有模型都在管理应用程序中注册,用户测试这是超级用户.该模型是:

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)
Run Code Online (Sandbox Code Playgroud)

加上一些不太重要的方法.另外,在此之前的最后一次我测试了管理员是在我创建所有这些方法后,所以它应该无关紧要.

管理员很少需要访问此页面.通常它只是列出PoS,但它仍然困扰我.知道为什么它可以挂?所有其他型号都运行得很好.

这在Django 1.2.5和1.3上都有发生

编辑:

我修改了超时限制.它工作正常,但不知何故,实际发生它需要几分钟.所以,背景中的某些东西需要很长时间.我不明白为什么它只发生在这个模型上,它发生在不同的环境中(和小数据集)


我差点想拍打自己.我没有睡这么久的错.

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

现在我想知道如何控制外键在admin中的显示方式.任何人都可以帮忙吗?

spu*_*lec 28

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

raw_id_fields = ('zipcode',)
Run Code Online (Sandbox Code Playgroud)

这将显示邮政编码的PK而不是下拉列表.

您是否有理由设置zipcode作为自己的模型,而不是使用CharField或实际的zipcode modelfield


nsf*_*n55 7

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

class FlaggedCommentsAdmin(ModelAdmin):
    list_display = ('user', 'discussion', 'flagged_on')
    readonly_fields = ('user', 'discussion')
Run Code Online (Sandbox Code Playgroud)


Ben*_*ier 6

对于仍然登陆此页面的人:正如 Mamsaac 在他的原始帖子中指出的那样,超时发生是因为 django 尝试将 a 的所有实例加载ForeignKey到 html-select 中。Django 2 允许您添加一个自动完成字段,该字段允许您异步搜索来ForeignKey处理此问题。在你admin.py做这样的事情:

from django.contrib import admin
from .models import Parent, Child

@admin.register(Parent)
class ParentAdmin(admin.ModelAdmin):
    # tell admin to autocomplete-select the "Parent"-field 'children'
    autocomplete_fields = ['children']

@admin.register(Child)
class ChildAdmin(admin.ModelAdmin):
    # when using an autocomplete to find a child, search in the field 'name'
    search_fields = ['name']      
Run Code Online (Sandbox Code Playgroud)