python - Django Admin list_display 添加列【统计相关外键的记录】

标签 python django count foreign-keys django-admin

我是 Python 和 Django 的新手。

我试图计算模型的外键项/记录并将其显示为 Admin list_display 中的一列。

所以我有一个模型“Author”,作为模型“Book”的外键。

这是 models.py:

class Author(models.Model):

    name = models.CharField(
        max_length=100,
    )

    class Meta:
        ordering = ['-name ']
        verbose_name = _('Author')
        verbose_name_plural = _('Authors')

    def __str__(self):
        return self.author

    @models.permalink
    def get_absolute_url(self):
        return reverse('author_detail', kwargs={'pk': self.pk})

class Book(models.Model):
    author = models.ForeignKey(
        'Author',
        related_name='menu_items', 
        verbose_name=_('author'),
    )

    bookname= models.CharField(
        max_length=100,
    )

    publisher= models.CharField(
        max_length=100,
    )
    class Meta:
        ordering = ['-bookname']
        verbose_name = _('Book')
        verbose_name_plural = _('Books')

    def __str__(self):
        return self.bookname

    @models.permalink
    def get_absolute_url(self):
        return ('book_detail', [self.pk])

这是admin.py

from django.contrib import admin
from .models import Author, Book

class BookInline(admin.TabularInline):
    model = Book
    extra = 1

@admin.register(Author)
class LibraryAdmin(admin.ModelAdmin):
    def NumberOfBooks(self, obj):
        #I guess sth is wrong here when trying to count the book_set
        return obj.book_set.count()

    NumberOfBooks.short_description = "Books Count"
    list_display = ['bookname', 'publisher', 'NumberOfBooks']
    inlines = [BookInline]

我想统计每个Author写了多少本书,在管理页面的二级Home>Authors>Author这样显示:

 Author | Books Count
Someone1  NumberOfBooks
Someone2  NumberOfBooks
Someone3  NumberOfBooks
Someone4  NumberOfBooks

但是我得到了错误:

'Author' object has no attribute 'book_set'

<强>1。我做的 obj.book_set.count() 错了吗? 我认为 obj.book_set 会引用同一“作者”(obj) 下的“书”,听起来我误解了它,但我不确定如何实现我的意图。

<强>2。相反,如果我想向“作者”添加一个字段以自动计算与每个作者相关的“书籍”的数量,这是否是更好的方法,那么该怎么做呢?

最佳答案

错误页面上应该有一个包含所有可用字段的列表,您应该找到一个名为 menu_items 的字段(这就是您在 中放入 related_name 的内容>书籍模型)。

但这可能不是最好的选择。您应该能够覆盖 LibraryAdmin(admin.ModelAdmin) 类上的 get_queryset() 方法,如下所示:

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

@admin.register(Loan)
class LibraryAdmin(admin.ModelAdmin):

    def get_queryset(self, request):
        qs = super(LibraryAdmin, self).get_queryset(request)
        return qs.annotate(books_count=Count('menu_items'))

    def books_count(self, inst):
        return inst.books_count

    list_display = ['bookname', 'publisher', 'books_count']
    inlines = [BookInline]

这样计数将由您的数据库完成。

关于python - Django Admin list_display 添加列【统计相关外键的记录】,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797162/

相关文章:

ModelSerializer 中的 Django 自定义查询集

r - 创建一个按组捕获最频繁出现的变量

python - Maya——通过 Python 在视口(viewport)中选择对象

python - 在sympy中获取项系数

python - 多个对象返回 Django

django - 如何更改 django 中的过滤器以反射(reflect)不等于?

SQL聚合函数子查询

mysql - 从四个表中选择计数

python - 设置数据类型的大小限制

python - 从基于类的通用 View 手动获取响应