Django Admin的性能优化

2023-04-11 00:00:00 django 优化 性能
  1. 缓存

Django Admin的一个性能瓶颈是它需要频繁的数据库查询。为了解决这个问题,我们可以使用缓存。

我们可以使用Django内置的缓存框架,将Django Admin的页面缓存一段时间。比如,在settings.py中添加以下配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHE_MIDDLEWARE_SECONDS = 60 * 5
CACHE_MIDDLEWARE_KEY_PREFIX = 'pidancode.com'

其中,BACKEND指定我们使用的缓存后端,这里使用的是Memcached。LOCATION指定了缓存服务器的地址。

同时,我们也可以指定缓存的有效时间和前缀。

  1. 关闭不必要的查询

在Django Admin中,默认会查询每个对象的关联数据。如果我们不需要这些数据,可以通过重写get_queryset()方法,关闭这些查询。

class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.select_related(None).prefetch_related(None)
        return qs

这段代码将关闭select_relatedprefetch_related方法,避免不必要的查询。

  1. 批量操作

Django提供了一个批量操作API,可以让我们一次性更新多条数据:

from django.contrib import admin

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    actions = ['batch_update']

    def batch_update(self, request, queryset):
        # 批量更新数据
        pass

    batch_update.short_description = '批量更新'

在Django Admin中选择多个对象后,就可以使用批量操作了。

  1. 自定义List Filter

Django Admin中的List Filter可以让我们按照特定的字段筛选结果。不过,如果我们查询的是一个大表,可能会影响性能。

为了解决这个问题,我们可以自定义List Filter,使用distinct()方法去重:

class MyModelFilter(admin.SimpleListFilter):
    title = '字段'
    parameter_name = 'field'

    def lookups(self, request, model_admin):
        return (
            ('value1', '值1'),
            ('value2', '值2'),
            ('value3', '值3'),
        )

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(field=self.value()).distinct()
        else:
            return queryset
  1. 使用Raw ID Fields

在Django Admin中,如果一个字段是ForeignKey或ManyToManyField类型,它的默认展示方式是使用Select框。如果ForeignKey或ManyToManyField对应的表非常大,那么加载Select框的时间可能非常长。

为了解决这个问题,Django提供了一个Raw ID Fields的功能。它可以让我们使用一个文本框来输入ForeignKey或ManyToManyField对应的主键。

class MyModelAdmin(admin.ModelAdmin):
    raw_id_fields = ['field1', 'field2']

这样,我们就可以避免加载Select框的时间。

以上是几种常见的Django Admin的性能优化方法,它们可以极大地提升Django Admin的性能。

相关文章