预取django-admin中m2m字段的值



我有自己的授权用户模型,它继承自PermissionsMixin。当我访问django-admin页面的任何实例的模型,我得到了很多数据库查询(因为我有很多权限)。问题出在这里,django/contrib/auth/models.py:

class Permission(models.Model):
[...]
def __str__(self):
    return "%s | %s | %s" % (
        six.text_type(self.content_type.app_label),
        six.text_type(self.content_type),
        six.text_type(self.name))

每次在admin页面上显示一个权限时,它都会查询其content_type。

问题是:我可以确保每一个查询涉及我的Auth用户模型,特别是对于那些不是来自我的代码(如django admin)将运行prefetch_related的权限和他们的content_types?

如果您只需要为django-admin创建这个页面,那么您可以使用官方文档中描述的技术创建自己的管理页面。

例如:

from django.contrib import admin
from django.contrib.auth.models import Permission
from foo.models import User

class UserAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        if db_field.name == 'user_permissions':
            kwargs['queryset'] = Permission.objects.all().select_related('content_type')
        return super(UserAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
admin.site.register(User, UserAdmin)

最新更新