Django:显示admin list_display中相关对象的数量

时间:2015-09-07 17:18:04

标签: python django

我想在django的list_display属性中显示相关对象的数量。 例如,我们有一个类别字段,我们想要显示在此类别中发布了多少博客帖子

到目前为止我已尝试过这个:

admin.py:

from .models import Category

class CategoryAdmin(admin.ModelAdmin):
    def category_post_count(self, obj):
        return obj.post_set.count
category_post_count.short_description = "Posts Count"

list_display = ['category', 'category_post_count']

models.py:

class Category(models.Model):
    category = models.CharField(max_length=25)

class Post(models.Model):
    category = models.ForeignKey(Category, null=True, blank=False)

2 个答案:

答案 0 :(得分:13)

ord是一个函数,因此您必须通过在末尾添加括号()来调用它:

def category_post_count(self, obj):
    return obj.post_set.count()

答案 1 :(得分:5)

尽管可接受的答案将产生预期的结果,但是在大多数情况下,这不是应该这样做的,因为它会产生“ n + 1”问题,即每行又有一个sql查询。

您应该修改您的管理员类(如果您需要的不仅仅是管理员,则需要修改管理员)以获取计数注释(这是django的聚合列术语),然后使用此值。它将在主选择查询中计算计数,避免生成不必要的查询。

...
from django.db.models import Count
...

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = [..., 'post_count']

    ...

    def post_count(self, obj):
        return obj.post_count

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        queryset = queryset.annotate(post_count=Count("post"))
        return queryset