在 admin 的数据详情页中显示数据量大的关联外键会导致后台卡顿甚至死机
因为 django 默认会把依赖外键中的所有数据全部加载,浏览器会停顿超时
使用 raw_id_fields
@admin.register(City)
class CityAdmin(admin.ModelAdmin):
list_display = 'id', 'country_id', 'name', 'image', 'add_time'
raw_id_fields = 'country_id',
使用 autocomplete_fields
model 外键设置
class City(models.Model):
country_id = models.ForeignKey(Country, db_column='country_id', on_delete=models.CASCADE, verbose_name='国家')
admin 里设置 autocomplete_fields
class CityAdmin(admin.ModelAdmin):
list_display = 'id', 'country_id',
autocomplete_fields = 'country_id',
关联的 admin 要设置对应的 search_fields
搜索功能就是使用的这里的 search_fields
class CountryAdmin(admin.ModelAdmin):
search_fields = 'name',
使用多级关联 django-smart-selects
安装 django-smart-selects 插件
pip install django-smart-selects
添加 ‘smart_selects’, 到 INSTALLED_APPS 中
INSTALLED_APPS = [
xxx...
'smart_selects',
]
在项目 urls.py 中添加 chaining/
urlpatterns = [
path('admin/', admin.site.urls),
path('chaining/', include('smart_selects.urls')),
]
在 model 中定义 ChainedForeignKey
from smart_selects.db_fields import ChainedForeignKey
class City(models.Model):
country_id = models.ForeignKey(Country, db_column='country_id', on_delete=models.CASCADE, verbose_name='国家')
province_id = ChainedForeignKey(
Province,
chained_field='country_id',
show_all=False, auto_choose=True, sort=True, db_column='province_id')