在 admin 的数据详情页中显示数据量大的关联外键会导致后台卡顿甚至死机
因为 django 默认会把依赖外键中的所有数据全部加载,浏览器会停顿超时

使用 raw_id_fields

  1. @admin.register(City)
  2. class CityAdmin(admin.ModelAdmin):
  3. list_display = 'id', 'country_id', 'name', 'image', 'add_time'
  4. raw_id_fields = 'country_id',

image.png
点击放大镜会进入外键的搜索界面

使用 autocomplete_fields

model 外键设置

  1. class City(models.Model):
  2. country_id = models.ForeignKey(Country, db_column='country_id', on_delete=models.CASCADE, verbose_name='国家')

admin 里设置 autocomplete_fields

  1. class CityAdmin(admin.ModelAdmin):
  2. list_display = 'id', 'country_id',
  3. autocomplete_fields = 'country_id',

关联的 admin 要设置对应的 search_fields
搜索功能就是使用的这里的 search_fields

  1. class CountryAdmin(admin.ModelAdmin):
  2. search_fields = 'name',

image.png

使用多级关联 django-smart-selects

安装 django-smart-selects 插件

  1. pip install django-smart-selects

添加 ‘smart_selects’, 到 INSTALLED_APPS 中

  1. INSTALLED_APPS = [
  2. xxx...
  3. 'smart_selects',
  4. ]

在项目 urls.py 中添加 chaining/

  1. urlpatterns = [
  2. path('admin/', admin.site.urls),
  3. path('chaining/', include('smart_selects.urls')),
  4. ]

在 model 中定义 ChainedForeignKey

  1. from smart_selects.db_fields import ChainedForeignKey
  2. class City(models.Model):
  3. country_id = models.ForeignKey(Country, db_column='country_id', on_delete=models.CASCADE, verbose_name='国家')
  4. province_id = ChainedForeignKey(
  5. Province,
  6. chained_field='country_id',
  7. show_all=False, auto_choose=True, sort=True, db_column='province_id')