2016-11-25 96 views
1

我是Python和Django的新手。Django Admin list_display添加列[相關外鍵的計數記錄]

我正在嘗試計算模型的外鍵項目/記錄,並將其顯示爲Admin list_display中的列。

所以我有一個模型「作者」,作爲模型「書」的外鍵。

這裏的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 | 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.相反,如果我想爲'作者'添加一個字段來自動統計與每個作者有關的「書」數量,這應該是一個更好的方法,那麼該怎麼做?

回答

4

應該有與錯誤頁面上的所有可用字段列表,你應該找到一個域名爲menu_items(這就是你投入related_nameBook模型)。

但這可能不是最好的選擇。你應該能夠覆蓋get_queryset()方法您LibraryAdmin(admin.ModelAdmin)類是這樣的:

... 
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] 

這樣計數將由您的DB來完成。

+0

' 錯誤: :(admin.E108)'list_display [3]'的值是指'books_count',它不是可調用的,'LibraryAdmin ',或'作者。作者'的屬性或方法.' –

+0

這就是我得到的錯誤,我現在很困惑... 順便說一下'@admin.register(Loan)'應該是'@admin .register(作者)',我輸入錯了,但這不是問題,例如爲了讓我更容易理解,我改了一些名字。 –

+0

我最後加入得到這個工作: '高清show_books_count(自我,研究院): \t \t回inst.books_count \t list_display = [ 'BOOKNAME', '發行人', 'show_books_count']' 但你能解釋一下爲什麼這個工作和'(self,inst)'做了什麼?可以簡化並添加到'def get_queryset'中? –