关于python:Django Admin list_display添加列[相关ForeignKey的计数记录]

Django Admin list_display add column [count records of related ForeignKey]

我是Python和姜戈的新手。

我试图计算模型的外键项/记录,并将其显示为"管理列表"显示中的一列。

所以我有一个模型"作者",作为模型"书"的外键。

这是models.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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])

这是行政人员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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]

我想计算每个作者写了多少本书,并在管理页面主页>作者>作者的第二级显示如下内容:

1
2
3
4
5
 Author | Books Count
Someone1  NumberOfBooks
Someone2  NumberOfBooks
Someone3  NumberOfBooks
Someone4  NumberOfBooks

但是我得到了错误:

1
'Author' object has no attribute 'book_set'

1。我做错了obj.book_set.count()吗?我以为obj.book_set会指同一个"作者"(obj)下的"书",听起来我误解了,但我不知道如何实现我的目标。

2。相反,如果我想在"authors"中添加一个字段,该字段将自动计算与每个authors相关的"book"的数量,那么这是否是一种更好的方法,以及如何做到这一点呢?


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
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]

这样,数据库将进行计数。