介绍
- 首先介绍这篇文章实现的功能:在实际的使用场景中可能会出现某个数据表数据过多,但是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
模型。注:
proxy = True
是在定义代理模型时使用的一个元选项(Meta option)。这个选项告诉Django该模型是一个代理模型。
当使用代理模型时,在数据库中不创建新的表,而是与原始模型共享相同的表。代理模型允许对原始模型进行扩展、定制和修改,而不需要创建新的数据库表。
在Django中,如果我们不定义一个模型为代理模型,它将默认被认为是一个普通的模型,并将在数据库中创建一个独立的表。但是,当设置proxy = True
时,Django会将该模型标识为代理模型,并在数据库中不创建新的表。
代理模型继承了原始模型的字段和方法,它只是为了提供一种对原始模型的不同表示或定制行为。通过使用代理模型,可以轻松地为同一模型创建多个不同的管理类,以满足不同的需求和展示方式。 -
在上述代码中,
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
代理模型的记录。文章来源:https://www.toymoban.com/news/detail-477444.html -
这种使用代理模型的方式可以帮助我们根据不同的需求和角色,灵活地展示和管理模型的不同视图和过滤结果,提供更好的管理体验。文章来源地址https://www.toymoban.com/news/detail-477444.html
到了这里,关于Django 一个 model 注册多个 admin 表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!