提升Django Admin中ForeignKey字段的性能

19 投票
4 回答
8174 浏览
提问于 2025-04-16 12:28

默认情况下,Django的管理后台会把外键字段显示为一个下拉选择框,这个选择框会列出外表中的每一条记录作为选项。在我一个可以访问的模型中,我引用了用户模型作为外键,但因为我有成千上万的用户,所以Django会把下拉框填满成千上万的选项。这导致管理页面加载得非常慢,而且这个下拉框也不太好用,因为要滚动几千个选项才能找到你想要的。

有没有什么好的方法可以改变这个字段的显示方式,以提高页面加载速度和使用体验?我希望能把下拉框换成某种按钮,点击后弹出一个搜索表单,或者是一个文本框,通过Ajax搜索关键词来找到特定用户的ID,以便进行关联。管理后台有没有类似的内置功能,还是说我需要从头开始写这个?

4 个回答

12

你说得对,Cerin,造成速度变慢的原因是因为Django在下拉框(<select>元素)里填入了太多选项。你可能想用一个自动完成的元素来代替。

有趣的是,Django 2.0在管理界面上新增了一个功能,叫做 autocomplete_fields,我觉得在这种情况下你会觉得它很有用。这个功能使用了AJAX技术。

class ExampleAdmin(models.ModelAdmin):
    autocomplete_fields = ['example_field_user']
30

在你的模型中添加 raw_id_fields,这样就只会显示ID,而不是下拉菜单。

10

你可以使用一些自动补全的应用程序来帮助Django。你可以在Django Packages上查看这些应用。

还有一个叫django-extensions的工具,它里面有一个功能叫ForeignKeyAutocompleteAdmin,这个功能非常适合你的需求。

撰写回答