在 django-admin 中预取 m2m 字段值
Prefetch m2m field values in django-admin
我有自己的 Auth User 模型,它继承自 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))
每次在管理页面上显示权限时,都会查询其 content_type。
问题是:我能否确保对于涉及我的 Auth User 模型的每个查询,尤其是那些不是来自我的代码(如 django admin)的查询将是 运行 prefetch_related权限及其 content_types?
如果你只需要 django-admin,那么你可以使用 official documentation.
中描述的技术创建你自己的管理页面
例如:
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)
我有自己的 Auth User 模型,它继承自 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))
每次在管理页面上显示权限时,都会查询其 content_type。
问题是:我能否确保对于涉及我的 Auth User 模型的每个查询,尤其是那些不是来自我的代码(如 django admin)的查询将是 运行 prefetch_related权限及其 content_types?
如果你只需要 django-admin,那么你可以使用 official documentation.
中描述的技术创建你自己的管理页面例如:
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)