我想在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)
答案 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