2016-11-25 2 views
1

Ich bin neu in Python und Django.Django Admin list_display Spalte hinzufügen [Anzahl Datensätze von verwandten ForeignKey]

Ich habe versucht, die Fremdschlüssel Artikel/Aufzeichnungen ein Modell zu zählen und es als eine Spalte in der Admin list_display anzuzeigen.

So habe ich ein Modell „Autor“, als Fremdschlüssel „Buch“ zu modellieren.

Hier ist die 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]) 

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

Ich mag, wie viele Bücher zählen hier jeder Autor schrieb, und wie diese auf der zweiten Ebene des Displays Admin-Seite Home> Autoren> Autor:

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

Allerdings erhalte ich die Fehlermeldung:

'Author' object has no attribute 'book_set' 

1. habe ich getan, das obj.book_set.count() falsch? Ich dachte obj.book_set zu „Buch“ unter dem gleichen „Autor“ (obj) beziehen würde, klinge wie ich es falsch verstanden, aber ich bin nicht sicher, wie zu erreichen, was ich gedacht.

2. Stattdessen, wenn ich ein Feld zu "Autoren" hinzufügen wollte, die Anzahl der "Buch" automatisch mit jedem Autor zählen würde, sollte dies ein besserer Ansatz und so wie es geht?

Antwort

4

Es sollte eine Liste mit allen verfügbaren Felder auf der Fehlerseite und Sie sollten ein Feld menu_items genannt finden (das ist, was Sie in related_name in Ihrem Book Modell setzen).

Aber das ist vielleicht nicht die beste Option sein.

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

diese Weise das Zählen von Ihrem DB getan werden: Sie sollten get_queryset() Methode auf Ihrer LibraryAdmin(admin.ModelAdmin) Klasse wie folgt außer Kraft setzen können.

+0

' Errors: : (admin.E108) Der Wert von 'list_display [3]' bezieht sich auf 'books_count', die nicht eine aufrufbare ist, ein Attribut von‚LibraryAdmin ‚oder ein Attribut oder eine Methode auf‘ authors.Author'.' –

+0

das ist der Fehler, den ich immer bin, und ich bin jetzt wirklich verwirrt ... vom way'@admin.register (Loan) '' sollte @admin sein .register (Autor) ', Ich habe mich vertippt, aber das ist nicht das Problem hier, zum Beispiel, ich änderte die Namen ein bisschen, um es leichter zu verstehen. –

+0

ich endlich diese Arbeit durch Zugabe: 'def show_books_count (self, inst): \t \t Rückkehr inst.books_count \t list_display = [ 'Bookname', 'Herausgeber', 'show_books_count']' aber könnten Sie erklären warum das funktioniert und was "(selbst, inst)" tut? kann es vereinfacht werden und in 'def get_queryset' eingefügt werden? –

Verwandte Themen