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()吗?我以为
2。相反,如果我想在"authors"中添加一个字段,该字段将自动计算与每个authors相关的"book"的数量,那么这是否是一种更好的方法,以及如何做到这一点呢?
错误页面上应该有一个包含所有可用字段的列表,您应该找到一个名为
但这可能不是最好的选择。您应该能够在您的
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] |
这样,数据库将进行计数。