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

标签 python django

我想在 Django 的 list_display 属性中显示相关对象的数量。 例如,我们有一个类别字段,我们想显示在该类别中发布了多少博文

到目前为止我已经试过了:

管理员.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']

模型.py:

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

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

最佳答案

虽然接受的答案会产生预期的结果,但在大多数情况下这不是应该的做法,因为它会产生“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

关于python - Django:在admin list_display中显示相关对象的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443471/

相关文章:

python - django-compressor 未与 django-shop 一起安装

django - 成员资格和事件 API?还是我应该自己做?

由于自动完成小部件字段,Django 表单不会提交

python - Python 子进程的实时输出

python - 如何对pandas数据框中的正数进行groupby连接总和

php - 从 Google Drive 中的 Txt、PDF、Doc 文件中提取电子邮件地址

python - 如何创建显示均值、中位数和众数的seaborn fiddle 图?

python - 设置索引,使用常见的列值作为数据框的索引

python - 在 __init__.py 和 'import as' 语句中导入

javascript - 使用 Django 通过 AJAX URL 传递参数