如何在Django admin的list_display中展示多对多字段关联的点赞总数
实现方法
你已经在Item模型中定义了统计点赞数的total_likes方法,只需要调整Admin配置即可实现需求,以下是不同层级的实现方案:
基础实现(直接生效)
修改Admin.py中的ItemAdmin配置,把total_likes方法名添加到list_display元组中:
from django.contrib import admin from .models import Categories, Item, Tools class ItemAdmin(admin.ModelAdmin): list_display = ('title','author','item_category','date', 'total_likes') list_filter = ('item_category',) admin.site.register(Categories) admin.site.register(Item, ItemAdmin) admin.site.register(Tools)
配置完成后刷新Admin的Item列表页,就可以看到新增的点赞数列。
进阶优化
自定义列名称、支持排序
如果需要修改列的显示名称(默认显示方法名total_likes),并且支持点击列头按点赞数排序,可以给模型中的total_likes方法添加属性:
# 你模型中已有的方法 def total_likes(self): return self.likes.count() # 新增以下两行配置 total_likes.short_description = '总点赞数' total_likes.admin_order_field = 'likes__count'
解决N+1性能问题
基础实现会对每个Item条目单独发起一次点赞数查询,数据量较大时会有性能损耗,可以通过重写Admin的get_queryset方法用聚合预计算所有点赞数,只查一次数据库:
from django.contrib import admin from django.db.models import Count from .models import Categories, Item, Tools class ItemAdmin(admin.ModelAdmin): list_display = ('title','author','item_category','date', 'total_likes') list_filter = ('item_category',) # 重写查询集,预计算所有条目点赞数 def get_queryset(self, request): queryset = super().get_queryset(request).annotate( _total_likes=Count('likes') ) return queryset # 直接取预计算的结果,无需二次查询 def total_likes(self, obj): return obj._total_likes total_likes.short_description = '总点赞数' total_likes.admin_order_field = '_total_likes' admin.site.register(Categories) admin.site.register(Item, ItemAdmin) admin.site.register(Tools)
内容的提问来源于stack exchange,提问作者Waqart
相关产品推荐
相关产品推荐

