You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:39:02