adr*_* li 4 python django foreign-keys count django-admin
我是Python和Django的新手.
我试图计算模型的外键项/记录,并将其显示为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])
Run Code Online (Sandbox Code Playgroud)
这是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]
Run Code Online (Sandbox Code Playgroud)
我想计算每个作者写的书数量,并在管理页面的第二级显示如下:首页>作者>作者:
Author | Books Count
Someone1 NumberOfBooks
Someone2 NumberOfBooks
Someone3 NumberOfBooks
Someone4 NumberOfBooks
Run Code Online (Sandbox Code Playgroud)
但是我得到错误:
'Author' object has no attribute 'book_set'
Run Code Online (Sandbox Code Playgroud)
1.我做obj.book_set.count()错了吗?
我认为obj.book_set在同一个"作者"(obj)下会提到"书",听起来我误解了它,但我不确定如何实现我的意图.
2.相反,如果我想在"作者"中添加一个字段来自动计算与每个作者相关的"书籍"的数量,那么这应该是一个更好的方法,那么如何做呢?
应该有一个列表,其中包含错误页面上的所有可用字段,您应该找到一个名为的字段menu_items(这是您related_name在Book模型中添加的字段).
但这可能不是最好的选择.您应该能够像这样覆盖类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]
Run Code Online (Sandbox Code Playgroud)
这种方式计数将由您的数据库完成.