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?
' 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'.' –
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. –
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? –