始终像对待 Django Admin 中的 raw_id_fields 一样对待 ForeignKey 字段

Kos*_*Kos 8 python django django-admin

这种情况在我的项目中经常发生:

  • 有人添加了一个Foo具有多个ForeignKey字段的模型,其中一个是指模型Bar
  • 为该模型添加了一个管理员(并且工作正常)
  • 代码已部署
  • 在生产服务器上,Bar有数百万个实例
  • 有人访问Foo的管理页面;Django 尝试Bar一次检索所有s(将它们显示在组合框中)并且服务器过载
  • 后来通过编辑Foo管理员并添加barraw_id_fields.

我想防止这种情况在未来发生,最好通过某种方式声明(一劳永逸)Bar有很多行,并且应该始终将引用它的字段视为raw_id_fields所有管理页面中列出的字段。这有可能吗?

Fra*_*llo 0

来自文档:

foreignKey由django.forms.ModelChoiceField表示,它是一个ChoiceField,其选择是一个模型QuerySet。

ModelChoiceField 扩展了 Field,因此有一个可以被滥用的小部件属性 https://github.com/django/django/blob/master/django/forms/fields.py#L49

将其添加到项目文件中的某个位置。

from django.forms import ModelChoiceField
from django.contrib.admin.widgets import ForeignKeyRawIdWidget
ModelChoiceField.widget = ForeignKeyRawIdWidget
Run Code Online (Sandbox Code Playgroud)

缺点:这也会发生在非管理表单上