介绍
- 首先介绍这篇文章实现的功能:在实际的使用场景中可能会出现某个数据表数据过多,但是Django 的 admin 后台对于大批量数据的查询速度一言难尽,比如我有一个用户表,但是大部分时间都只需要查询被禁用的用户,而直接进行查询所有用户实在是太慢了,所以我把用户表在 admin 后台展现为了两个表,一个展示所有的用户,一个只展示被禁用的用户。其实使用
list_filter也能直接在一个表中根据用户的状态分组,但是当数据量和分组条件越来越多的时候查询速度会变的越来越慢。
定义 model
-
定义一个名为
User2Manager的自定义管理器类,它继承自Manager:from django.db.models import Manager, Model class User2Manager(Manager): def get_queryset(self): return super().get_queryset().filter(is_enable=True) -
在这个自定义管理器中,重写了
get_queryset方法,通过调用super().get_queryset()获取基类(Manager)的查询集,并在其基础上应用了额外的过滤条件,即filter(is_enable=True)。这意味着后面在使用这个管理器进行查询模型的记录时,只会返回is_enable字段为True的记录。 -
接下来,定义一个名为
User的模型,它继承自Model:class User(Model): name = CharField(max_length=32, verbose_name='姓名') phone = CharField(max_length=11, verbose_name='手机号') is_enable = BooleanField(verbose_name='启用状态', default=True) -
这个
User模型具有name、phone和is_enable字段,分别表示姓名、手机号和启用状态。name和phone字段都是CharField类型,而is_enable字段是BooleanField类型,默认值为True。 -
然后,定义一个名为
User2的代理模型,它继承自User模型:class User2(User): objects = User2Manager() class Meta: proxy = True -
在这个代理模型中,通过设置
objects属性为User2Manager(),将自定义的管理器应用于User2模型。 -
在上述代码中,
User2是一个代理模型,通过设置proxy = True,告诉Django不要为User2创建一个独立的数据库表,而是与原始模型User共享相同的表。这样,我们可以在Admin后台注册User2的管理类,并为其提供定制的展示和行为,而无需额外的数据库表。
注册 admin
-
导入了
admin模块,并在Admin后台注册了User模型和User2代理模型的管理类。
为User模型创建一个管理类UserAdmin:from django.contrib import admin @admin.register(User) class UserAdmin(admin.ModelAdmin): search_fields = ['name', 'phone'] list_display = ('id', 'name', 'phone') -
在
UserAdmin中,我们通过@admin.register(User)装饰器将User模型与UserAdmin关联起来。然后,设置了search_fields属性为['name', 'phone'],这样在Admin后台的搜索框中可以搜索这两个字段。而list_display属性指定了在Admin后台列表页面中显示哪些字段。 -
为
User2代理模型创建一个管理类User2Admin:@admin.register(User2) class User2Admin(admin.ModelAdmin): search_fields = ['name', 'phone'] list_display = ('id', 'name', 'phone') -
同样,我们使用
@admin.register(User2)装饰器将User2代理模型与User2Admin管理类关联起来。在User2Admin中,设置了与UserAdmin相同的search_fields和list_display属性,以便在Admin后台中具有相似的搜索和列表展示功能。 -
通过以上代码和配置,我们实现了两个Admin后台管理类
UserAdmin和User2Admin,分别用于管理User模型和User2代理模型的记录。这样,我们就可以在Admin后台展示多个列表信息,其中UserAdmin展示User模型的记录,而User2Admin展示经过额外过滤的User2代理模型的记录。 -
这种使用代理模型的方式可以帮助我们根据不同的需求和角色,灵活地展示和管理模型的不同视图和过滤结果,提供更好的管理体验。










