Skip to content

Commit

Permalink
Increase admin list panel performance by selecting related (#134)
Browse files Browse the repository at this point in the history
* Increase admin panel performance by selecting related

* Use `get_changelist_instance` override
  • Loading branch information
henribru authored May 15, 2020
1 parent 57a52ae commit 03ae00a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
21 changes: 14 additions & 7 deletions easyaudit/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@ class CRUDEventAdmin(EasyAuditModelAdmin):
'user_pk_as_string', 'datetime', 'changed_fields_prettified']
exclude = ['object_json_repr', 'changed_fields']

def get_changelist_instance(self, *args, **kwargs):
changelist_instance = super().get_changelist_instance(*args, **kwargs)
content_type_ids = [obj.content_type_id for obj in changelist_instance.result_list]
self.content_types_by_id = {content_type.id: content_type for content_type in ContentType.objects.filter(id__in=content_type_ids)}
return changelist_instance

def get_content_type(self, obj):
return ContentType.objects.get(id=obj.content_type_id)
return self.content_types_by_id[obj.content_type_id]

get_content_type.short_description = "Content Type"

def get_user(self, obj):
return get_user_model().objects.filter(id=obj.user_id).first()
return self.users_by_id.get(obj.user_id)

get_user.short_description = "User"

Expand All @@ -41,9 +47,10 @@ def object_repr_link(self, obj):
html = obj.object_repr
else:
try:
content_type = self.get_content_type(obj)
url = reverse("admin:%s_%s_change" % (
obj.content_type.app_label,
obj.content_type.model,
content_type.app_label,
content_type.model,
), args=(obj.object_id,))
html = '<a href="%s">%s</a>' % (url, obj.object_repr)
except:
Expand Down Expand Up @@ -76,12 +83,12 @@ class LoginEventAdmin(EasyAuditModelAdmin):
readonly_fields = ['login_type', 'get_username', 'get_user', 'remote_ip', 'datetime', ]

def get_user(self, obj):
return get_user_model().objects.filter(id=obj.user_id).first()
return self.users_by_id.get(obj.user_id)

get_user.short_description = "User"

def get_username(self, obj):
user = get_user_model().objects.filter(id=obj.user_id).first()
user = self.get_user(obj)
username = user.get_username() if user else None
return username

Expand All @@ -101,7 +108,7 @@ class RequestEventAdmin(EasyAuditModelAdmin):
readonly_fields = ['url', 'method', 'query_string', 'get_user', 'remote_ip', 'datetime', ]

def get_user(self, obj):
return get_user_model().objects.filter(id=obj.user_id).first()
return self.users_by_id.get(obj.user_id)

get_user.short_description = "User"

Expand Down
7 changes: 6 additions & 1 deletion easyaudit/admin_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,14 @@ def prettify_json(json_string):


class EasyAuditModelAdmin(admin.ModelAdmin):
def get_changelist_instance(self, *args, **kwargs):
changelist_instance = super().get_changelist_instance(*args, **kwargs)
user_ids = [obj.user_id for obj in changelist_instance.result_list]
self.users_by_id = {user.id: user for user in get_user_model().objects.filter(id__in=user_ids)}
return changelist_instance

def user_link(self, obj):
user = get_user_model().objects.filter(id=obj.user_id).first()
user = self.users_by_id.get(obj.user_id)
#return mark_safe(get_user_link(user))
if user is None:
return '-'
Expand Down

0 comments on commit 03ae00a

Please sign in to comment.