Django 2.0获取已注册模型列表(替代过时API方法咨询)
获取Django 2.0中与Admin首页一致的已注册模型列表
嘿,我之前升级到Django 2.0时也碰到过这个问题,那些旧API确实都被弃用了,但咱们可以直接借助Django Admin本身的机制,拿到和首页完全匹配的已注册模型列表,下面是具体解决方案:
核心思路:利用AdminSite的注册记录
Django Admin会把所有注册的模型存在AdminSite实例的_registry属性里,默认的Admin站点就是django.contrib.admin.site,直接用它就能获取所有已注册模型及其对应的ModelAdmin实例。
步骤1:获取所有已注册模型
先导入默认的Admin站点,然后访问它的_registry属性:
from django.contrib.admin import site # 已注册模型字典:键是模型类,值是对应的ModelAdmin实例 registered_models = site._registry
步骤2:按App分组(和Admin首页结构一致)
如果需要和Admin首页一样按App分组展示,结合Django的apps模块获取App的详细信息,整理成结构化数据:
from django.apps import apps # 初始化分组字典 grouped_models = {} for model, model_admin in registered_models.items(): # 获取模型所属的App配置 app_config = apps.get_app_config(model._meta.app_label) # 用App的友好名称作为分组键 app_verbose_name = app_config.verbose_name # 将模型添加到对应App分组 if app_verbose_name not in grouped_models: grouped_models[app_verbose_name] = [] grouped_models[app_verbose_name].append({ "model_class": model, "model_admin": model_admin, "model_verbose_name": model._meta.verbose_name, "model_verbose_name_plural": model._meta.verbose_name_plural, # 如需Admin权限信息,可从model_admin获取(传入request可做真实权限校验) "has_add_permission": model_admin.has_add_permission(None), "has_change_permission": model_admin.has_change_permission(None) })
过时API的替代说明
- 替代
from django.db.models import get_models:现在推荐用apps.get_models(),但它会返回所有已安装App的模型(包括未在Admin注册的)。如果只需要Admin已注册的模型,site._registry是更精准的选择。 - 替代
from django.contrib.admin.validation import validate:Django 2.0之后,Admin在注册模型时会自动执行验证逻辑,无需手动调用该函数。若需手动验证ModelAdmin配置,可调用model_admin.check()方法,它会返回所有验证错误。
自定义AdminSite的适配
如果你用了自定义的AdminSite(而非默认的admin.site),只需把代码中的site换成你自己定义的AdminSite实例即可,比如:
# 假设你自定义了MyAdminSite from myapp.admin import MyAdminSite custom_site = MyAdminSite(name='custom_admin') registered_models = custom_site._registry
这样整理出的grouped_models结构就和Admin首页完全一致,按App分组展示已注册模型,还能获取Admin的配置和权限信息。
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

